This commit is contained in:
2025-10-23 17:13:28 +08:00
parent e86b537bd1
commit 34233eab66
6 changed files with 472 additions and 282 deletions

View File

@@ -2,8 +2,8 @@
//记得切换
//正式
const mediaUrl = '/public/';
const baseUrl = '/';
// const mediaUrl = '/public/';
// const baseUrl = '/';
// const mediaUrl = 'https://submission.tmrjournals.com/public/';
// // const mediaUrl = 'http://zmzm.tougao.dev.com/public/';
@@ -11,9 +11,9 @@ const baseUrl = '/';
//本地(正式环境 )
// const mediaUrl = 'https://submission.tmrjournals.com/public/';
const mediaUrl = 'https://submission.tmrjournals.com/public/';
// const baseUrl = '/api';
const baseUrl = '/api';
//晓玲
// const mediaUrl = 'http://zmzm.tougao.dev.com/public/';

View File

@@ -2,35 +2,36 @@
<div class="login-wrap">
<div class="ms-login">
<div class="ms-title">User Register</div>
<el-form class="ms-content" :rules="registerRules" ref="registerForm" :model="registerForm" label-width="0">
<el-form class="ms-content" :rules="registerRules" ref="registerForm" :model="registerForm" label-width="140px">
<!-- 用户名 -->
<el-form-item prop="username">
<el-input size="small" v-model="registerForm.username" auto-complete="off" placeholder="username">
<el-form-item prop="username" class="form-item" label="English Name :">
<el-input size="small" v-model="registerForm.username" auto-complete="off" placeholder="">
<i slot="prefix" class="el-icon-user"></i>
</el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item prop="password">
<el-input size="small" v-model="registerForm.password" auto-complete="off" placeholder="password"
<el-form-item prop="password" class="form-item" label="Password :">
<el-input size="small" v-model="registerForm.password" auto-complete="off" placeholder=""
show-password>
<i slot="prefix" class="el-icon-lock"></i>
</el-input>
</el-form-item>
<!-- 姓名 -->
<el-form-item prop="name">
<el-input size="small" v-model="registerForm.name" auto-complete="off" placeholder="realname">
<el-form-item prop="name" class="form-item" label="Real name :">
<el-input size="small" v-model="registerForm.name" auto-complete="off" placeholder="">
<i slot="prefix" class="el-icon-edit-outline"></i>
</el-input>
</el-form-item>
<!-- 手机 -->
<el-form-item prop="phone">
<el-input size="small" v-model="registerForm.phone" auto-complete="off" placeholder="phone">
<el-form-item prop="phone" class="form-item" label="Phone :">
<el-input size="small" v-model="registerForm.phone" auto-complete="off" placeholder="">
<i slot="prefix" class="el-icon-mobile-phone" />
</el-input>
</el-form-item>
<!-- 邮件 -->
<el-form-item prop="email">
<el-input size="small" v-model="registerForm.email" auto-complete="off" placeholder="email">
<el-form-item prop="email" class="form-item" label="Email :">
<el-input size="small" v-model="registerForm.email" auto-complete="off" placeholder="">
<i slot="prefix" class="el-icon-message"></i>
</el-input>
</el-form-item>
@@ -46,24 +47,25 @@
</el-input>
</el-form-item> -->
<!-- 验证码 -->
<el-form-item prop="code">
<el-form-item prop="code" class="form-item" label="Verification code :">
<el-row :span="24">
<el-col :span="16">
<el-input size="small" v-model="registerForm.code" auto-complete="off"
placeholder="captcha">
placeholder="">
<i slot="prefix" class="el-icon-key" />
</el-input>
</el-col>
<el-col :span="8">
<div class="login-code">
<img :src="image" @click="refreshCode" alt="captcha" class="captchaimg" />
<img :src="image" @click="refreshCode" alt="Verification code" class="captchaimg" />
</div>
</el-col>
</el-row>
</el-form-item>
<!-- 隐私政策 -->
<el-form-item prop="code">
<el-form-item prop="code" class="form-item">
<span class="required-field">*</span>
<el-row :span="24">
<p class="pri_tit">
<el-checkbox v-model="registerForm.checked">
@@ -90,7 +92,7 @@
</el-col>
<el-col :span="14"></el-col>
<el-col :span="4">
<el-link :underline="false" type="primary" href="/" class="rebacklogin">Go login</el-link>
<el-link :underline="false" type="primary" href="/" class="rebacklogin">Login</el-link>
</el-col>
</el-row>
@@ -139,7 +141,7 @@
registerRules: {
username: [{
required: true,
message: 'Please enter your username.',
message: 'Please enter your English name.',
trigger: 'blur'
}],
password: [{
@@ -153,11 +155,11 @@
trigger: 'blur'
}
],
// name: [{
// required: true,
// message: 'Please enter your real name.',
// trigger: 'blur'
// }],
name: [{
required: true,
message: 'Please enter your real name.',
trigger: 'blur'
}],
// phone: [{
// required: true,
// message: 'Please enter the correct mobile phone number.',
@@ -182,7 +184,7 @@
],
code: [{
required: true,
message: 'Captcha code cannot be empty.',
message: 'Please enter the verification code.',
trigger: 'blur'
}]
}
@@ -267,8 +269,8 @@
position: absolute;
left: 50%;
top: 50%;
width: 500px;
margin: -290px 0 0 -250px;
width: 620px;
margin: -290px 0 0 -270px;
border-radius: 5px;
background: #fff;
/* background: rgba(255, 255, 255, 0.3); */
@@ -276,7 +278,7 @@
}
.ms-content {
padding: 0 30px 30px 30px;
padding: 0 20px 20px 20px;
}
.login-btn {
@@ -327,4 +329,16 @@
line-height: 18px;
color: #999;
}
.form-item{
position: relative;
padding-left: 10px;
}
.required-field {
position: absolute;
z-index: 1;
left: -14px;
top: 0;
color: #F56C6C;margin-right: 4px;
}
</style>

View File

@@ -1,7 +1,7 @@
<template>
<div style="">
<div style="display: flex; justify-content: space-between">
<div style="width: 100%;min-width: 1020px; position: relative">
<div style="width: 100%; min-width: 1020px; position: relative">
<div class="step_list_new">
<el-steps :active="0" align-center>
<el-step
@@ -20,19 +20,9 @@
</el-steps>
</div>
<!-- <div class="step_list" style="width: 960px; position: relative">
<div v-for="item in listStep" @click="StepCode(item.index)" :class="show_step == item.index ? 'C_style' : ''">
<div>
<i :class="item.icon"></i>
{{ item.title }}
<div class="num">{{ item.index }}</div>
</div>
<p class="bor_der"></p>
</div>
<br clear="both" />
</div> -->
<div class="manu_add" style="width: calc(100% - 20px);" v-loading="loading">
<ProgressBar :progress="uploadPercentage" v-if="isShowProgress" />
<div class="manu_add" style="width: calc(100% - 20px)" v-loading="loading">
<el-form ref="articleform" :model="form" :rules="rules" label-width="120px">
<div class="bag_color" v-if="show_step == 1">
<div>
@@ -46,9 +36,7 @@
/>
</el-form-item>
<el-form-item label="Type :" prop="type" >
<el-form-item label="Type :" prop="type">
<el-select v-model="form.type" style="width: 240px" placeholder="">
<el-option
v-for="item in journal_type"
@@ -58,9 +46,32 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="Manuscirpt :" prop="manuscirpt" label-width="120px">
<el-upload :on-progress="handleProgress"
ref="uploadFileManuscirpt"
class="upload-demo up_newstyle"
:action="upload_manuscirpt"
accept=".docx"
name="manuscirpt"
:before-upload="beforeupload_manuscirpt"
:on-error="uperr_coverLetter"
:on-success="upSuccess_manuscirpt"
:limit="1"
:on-exceed="alertlimit"
:on-remove="removefilemanuscirpt"
:file-list="fileL_manuscirpt"
:on-preview="dowloadFile"
>
<div class="el-upload__text" @click="removefilemanuscirpt">
<em>Upload</em>
</div>
<div class="el-upload__tip" slot="tip">
Only Word and compressed files can be uploaded (file format: .docx).
</div>
</el-upload>
</el-form-item>
<el-form-item label="Manuscript Title :" prop="title" label-width="160px">
<el-input v-model="form.title" ></el-input>
<el-input v-model="form.title"></el-input>
</el-form-item>
<el-form-item label="Whether ethical approval was obtained ?" prop="approval" label-width="290px">
@@ -75,7 +86,6 @@
v-if="form.approval == 1"
label-width="290px"
>
<el-upload
ref="uploadFile"
class="upload-demo up_newstyle"
@@ -94,13 +104,18 @@
<div class="el-upload__text" @click="clearUploadedFile">
<em>Upload</em>
</div>
<div class="el-upload__tip" slot="tip" style="line-height: 20px;left: 80px;font-size: 13px;top: -9px;">
Only PDF and compressed files can be uploaded.<br/>
<span style="color: #8c8d8f;">Please ensure that the file includes the ethics approval number and the institutional approval document.</span>
<div
class="el-upload__tip"
slot="tip"
style="line-height: 20px; left: 80px; font-size: 13px; top: -9px"
>
Only PDF and compressed files can be uploaded.<br />
<span style="color: #8c8d8f"
>Please ensure that the file includes the ethics approval number and the institutional
approval document.</span
>
</div>
</el-upload>
</el-form-item>
<el-form-item
label="Explain the reason clearly :"
@@ -108,20 +123,10 @@
v-if="form.approval === 0"
label-width="300px"
>
<el-input
type="textarea"
rows="2"
v-model="form.approval_content"
></el-input>
<el-input type="textarea" rows="2" v-model="form.approval_content"></el-input>
</el-form-item>
<el-form-item label="Abstract :" prop="abstrart">
<el-input
type="textarea"
rows="5"
v-model="form.abstrart"
></el-input>
<el-input type="textarea" rows="5" v-model="form.abstrart"></el-input>
</el-form-item>
<!-- 话题 -->
<!-- <el-form-item label="Topics :" prop="topics">
@@ -137,7 +142,6 @@
:key="index"
:name="index + 1"
v-model="item.ke"
style="width: 150px; margin-right: 15px; margin-bottom: 3px"
></el-input>
<el-button type="text" @click="addfund">
@@ -145,14 +149,9 @@
</el-button>
</el-form-item>
<el-form-item label="Fund :">
<el-input
v-model="form.fund"
>
</el-input>
<el-input v-model="form.fund"> </el-input>
</el-form-item>
<div style="text-align: center; margin: 40px 0 0 0">
<el-button type="warning" @click="onStagingSave(1)" class="pro_stage">Save as draft </el-button>
<el-button type="primary" @click="onStep(1)" class="pro_ceed"
@@ -401,30 +400,7 @@
<div class="el-upload__tip" slot="tip">Only word files can be uploaded(.doc,.docx)</div>
</el-upload>
</el-form-item> -->
<el-form-item label="Manuscirpt :" prop="manuscirpt" label-width="200px">
<el-upload
ref="uploadFileManuscirpt"
class="upload-demo up_newstyle"
:action="upload_manuscirpt"
accept=".docx"
name="manuscirpt"
:before-upload="beforeupload_manuscirpt"
:on-error="uperr_coverLetter"
:on-success="upSuccess_manuscirpt"
:limit="1"
:on-exceed="alertlimit"
:on-remove="removefilemanuscirpt"
:file-list="fileL_manuscirpt"
:on-preview="dowloadFile"
>
<div class="el-upload__text" @click="removefilemanuscirpt">
<em>Upload</em>
</div>
<div class="el-upload__tip" slot="tip">
Only Word and compressed files can be uploaded (file format: .docx).
</div>
</el-upload>
</el-form-item>
<el-form-item label="Supplementary Material :" label-width="200px">
<el-upload
class="upload-demo up_newstyle"
@@ -443,7 +419,18 @@
<div class="el-upload__text">
<em>Upload</em>
</div>
<div class="el-upload__tip" slot="tip">Only ZIP files can be uploaded (file formats: .zip).</div>
<div
class="el-upload__tip"
slot="tip"
style="line-height: 20px; left: 80px; font-size: 13px; top: -9px"
>
Only ZIP files can be uploaded (file formats: .zip).
<br />
<span style="color: #888"
>Please upload the original, uncropped full-length Western blot images.</span
>
</div>
</el-upload>
</el-form-item>
<div style="text-align: center; margin: 40px 0 0 0">
@@ -517,11 +504,7 @@
</el-form-item>
<!-- 简介 -->
<el-form-item prop="introduction" label="Introduction :">
<el-input
type="textarea"
rows="3"
v-model="reviewerForm.introduction"
></el-input>
<el-input type="textarea" rows="3" v-model="reviewerForm.introduction"></el-input>
</el-form-item>
<!-- 国家 -->
<el-form-item prop="country" label="Country :">
@@ -547,12 +530,7 @@
</el-form-item>
<!-- 领域 -->
<el-form-item prop="field" label="Field :">
<el-input
size="small"
v-model="reviewerForm.field"
auto-complete="off"
></el-input>
<el-input size="small" v-model="reviewerForm.field" auto-complete="off"></el-input>
</el-form-item>
<!-- 职称 -->
<el-form-item prop="technical" label="Technical :">
@@ -566,12 +544,7 @@
</el-form-item>
<!-- 单位 -->
<el-form-item prop="company" label="Affiliation :">
<el-input
size="small"
v-model="reviewerForm.company"
auto-complete="off"
></el-input>
<el-input size="small" v-model="reviewerForm.company" auto-complete="off"></el-input>
</el-form-item>
<!-- 简历 -->
<el-form-item label="CV. :">
@@ -604,7 +577,6 @@
plain
icon="el-icon-plus"
style="width: 210px"
>Add Recommended Reviewer</el-button
>
</p>
@@ -623,7 +595,7 @@
<el-form
ref="tuiJianForm"
v-for="(item, index) in tuiJianForm"
:rules="rules"
:rules="tuiJianRules"
label-position="top"
label-width="110px"
class="tuijian_f"
@@ -633,39 +605,23 @@
Reviewer <span style="margin: 0 0 0 3px">{{ index + 1 }}</span>
</p>
<el-form-item label="Realname :" prop="realname">
<el-input v-model="item.realname" style="width: 160px"></el-input>
<el-input v-model="item.realname" clearable></el-input>
</el-form-item>
<el-form-item label="Email :" prop="email">
<el-input v-model="item.email" style="width: 160px" :validate-event="false"></el-input>
<el-input v-model="item.email" :validate-event="false" clearable></el-input>
</el-form-item>
<el-form-item label="Department :" >
<el-input v-model="item.department"></el-input>
<el-form-item label="Department :" prop="department">
<el-input v-model="item.department" clearable></el-input>
</el-form-item>
<!-- <el-form-item label="Country :" prop="country">
<el-select
v-model="item.country"
filterable
clearable
style="width: 180px"
>
<el-option
v-for="it in countrys"
:key="it.en_name"
:label="it.en_name"
:value="it.en_name"
></el-option>
</el-select>
</el-form-item> -->
<el-form-item label="Affiliation :" prop="Affiliation">
<el-input v-model="item.Affiliation" style="width: 160px" :validate-event="false"></el-input>
<el-form-item label="Affiliation :" prop="affiliation">
<el-input v-model="item.affiliation" :validate-event="false" clearable></el-input>
</el-form-item>
<el-form-item label="Filed :" prop="major_all">
<el-cascader
placeholder=""
:options="step4MajorList"
v-model="item.major_all"
:props="default4Params"
style="width: 270px"
clearable
></el-cascader>
</el-form-item>
@@ -692,35 +648,8 @@
investigation in line with our misconduct policy.
</p>
<!-- <h3 style="margin-bottom:16px;margin-top:30px;">Figure Copyright Declaration</h3>
<p style="line-height: 25px; margin: 0 10px 0 55px; font-size: 14px">
· I confirm that all figures in this manuscript are original<br/>
· I confirm that all figures in this manuscript used with proper permission. (upload the copyright permission letters or license documents figures.)
</p> -->
<!-- <div v-if="form.journal != 0">
<h3 style="margin-bottom:16px;margin-top:30px;">Article Processing Charge</h3>
<div style="line-height: 25px; margin: 0 10px 0 55px; font-size: 14px">
<div style="font-size: 16px;margin-bottom: 10px;font-weight: 700;">
$ {{ getFee(form.journal) }}
</div>
<div style="color: #8c8d8f;line-height: 20px;" v-if="getFee(form.journal) && getFee(form.journal) != '0.00'">
<i class="el-icon-warning" style="color: #517fd5; margin-right: 4px"></i>The article processing fee
applies to papers submitted and ultimately accepted for publication after January 1, 2025. For
authors seeking to apply for fee discounts, please
<a
style="color: rgb(81, 127, 213); cursor: pointer; text-decoration: underline"
href="https://www.tmrjournals.com/apc/"
target="_blank"
>click here</a
>
to view detailed policies.
</div>
</div>
</div> -->
<div style="margin:30px 0 30px 0px">
<div style="margin: 30px 0 30px 0px">
<el-form-item label-width="180px">
<span slot="label">
Invitation code
@@ -739,14 +668,14 @@
</el-popover>
:
</span>
<el-input
v-model="form.code"
style="width: 200px"
></el-input>
<el-input v-model="form.code" style="width: 200px"></el-input>
</el-form-item>
</div>
<el-form-item label="Article Processing Charge :" v-if="form.journal&&form.journal != 0" label-width="220px">
<el-form-item
label="Article Processing Charge :"
v-if="form.journal && form.journal != 0"
label-width="220px"
>
$ {{ getFee(form.journal) }}
<div style="color: #8c8d8f" v-if="getFee(form.journal) && getFee(form.journal) != '0.00'">
<i class="el-icon-warning" style="color: #517fd5; margin-right: 4px"></i>The article processing fee
@@ -762,18 +691,16 @@
</div>
</el-form-item>
<el-form-item label="Figure Copyright Declaration :" label-width="220px" prop="qualification">
<div style="color: #333" >
<el-radio v-model="form.qualification" label="1">I confirm that all figures in this manuscript are original.</el-radio>
<el-radio v-model="form.qualification" label="2">I confirm that all figures in this manuscript used with proper permission.</el-radio>
<el-form-item
label=""
prop="qualification_file"
v-if="form.qualification == 2"
label-width="0px"
<div style="color: #333">
<el-radio v-model="form.qualification" label="1"
>I confirm that all figures in this manuscript are original.</el-radio
>
<div style="position: relative;top: 4px;margin-left: 14px">
<el-radio v-model="form.qualification" label="2"
>I confirm that all figures in this manuscript used with proper permission.</el-radio
>
<el-form-item label="" prop="qualification_file" v-if="form.qualification == 2" label-width="0px">
<div style="position: relative; top: 4px; margin-left: 14px">
<el-upload
ref="uploadFile"
class="upload-demo up_newstyle"
@@ -792,13 +719,12 @@
<div class="el-upload__text" @click="clearUploadedFile">
<em>Upload</em>
</div>
<div class="el-upload__tip" slot="tip" style="color: #888;left:80px;font-size: 13px;">
Upload the copyright permission letters or license documents figures.<br/>
<div class="el-upload__tip" slot="tip" style="color: #888; left: 80px; font-size: 13px">
Upload the copyright permission letters or license documents figures.<br />
</div>
</el-upload>
</div>
</el-form-item>
</div>
</el-form-item>
@@ -812,17 +738,10 @@
<el-radio :label="2">No</el-radio>
</el-radio-group>
<div v-if="form.is_use_ai == 1">
<el-input
type="textarea"
v-model="form.use_ai_explain"
:rows="4"
></el-input>
<el-input type="textarea" v-model="form.use_ai_explain" :rows="4"></el-input>
</div>
</el-form-item>
<div style="margin: 50px 0 30px 30px">
<el-checkbox v-model="agreechecked" style="font-weight: bold">I accept </el-checkbox>
<el-link @click="licensebox = true" type="primary" style="padding-left: 5px; font-weight: bold">
@@ -879,10 +798,10 @@
attention.
</p>
<common-word-html
v-show="show_step == 3"
:articleId="stagingID"
imgHeight="120px"
v-if="isShowCommonWord && stagingID"
v-if="isShowCommonWord&&stagingID"
style="margin-top: 10px; box-sizing: border-box; background-color: #fff"
></common-word-html>
</div>
@@ -938,7 +857,6 @@
<el-autocomplete
class="inline-input"
v-model="authMeaIN.email"
:fetch-suggestions="
(queryString, callback) => {
chaMateFit(queryString, callback, 1);
@@ -991,7 +909,6 @@
class="inline-input"
v-model="authMeaIN.company"
:fetch-suggestions="searchCompany"
:trigger-on-focus="false"
@select="selCompany($event, index)"
style="width: 100%"
@@ -999,14 +916,14 @@
</el-autocomplete>
</el-form-item>
<el-form-item label="Department :" label-width="120px">
<el-input v-model="authMeaIN.department" ></el-input>
<el-input v-model="authMeaIN.department"></el-input>
</el-form-item>
<el-form-item label="Address :" label-width="120px">
<span slot="label">
<span style="color: #f56c6c" v-show="authMeaIN.isReport">*</span>
Address :
</span>
<el-input v-model="authMeaIN.address" ></el-input>
<el-input v-model="authMeaIN.address"></el-input>
</el-form-item>
<el-form-item label-width="120px">
<span slot="label">
@@ -1028,12 +945,29 @@
<script>
import JournalSelector from '@/components/page/components/article/journal-selector.vue';
import ProgressBar from '@/components/page/components/article/progress.vue';
export default {
components: {
JournalSelector
JournalSelector,
ProgressBar
},
data() {
// 自定义校验禁止QQ邮箱
const validateNotQQEmail = (rule, value, callback) => {
// 正则匹配QQ邮箱以@qq.com结尾不区分大小写
const qqEmailReg = /@qq\.com$/i;
if (value) { // 若有值必填校验已通过则检查是否为QQ邮箱
if (qqEmailReg.test(value)) {
callback(new Error('QQ email is not allowed')); // 不允许QQ邮箱
} else {
callback(); // 校验通过
}
} else {
callback(); // 空值由必填校验处理,这里不重复判断
}
};
return {
isShowProgress: false,
hasAIContent: ['1'],
isHasAI: '0',
majorValueList: [],
@@ -1041,7 +975,7 @@ export default {
usercap: localStorage.getItem('U_role'),
ms_alias: localStorage.getItem('ms_journal_alias'),
stagingID: this.$route.query.id,
isShowCommonWord: false,
isShowCommonWord: true,
move_step: 1, //进行步骤
show_step: 1, //显示内容
items: [],
@@ -1122,7 +1056,7 @@ export default {
qualification: '',
approval_content: '',
code: '',
is_use_ai: "",
is_use_ai: '',
use_ai_explain: ''
// topics:null
},
@@ -1143,21 +1077,11 @@ export default {
{
realname: '',
email: '',
country: '',
department: '',
affiliation: '',
major_all: ''
},
{
realname: '',
email: '',
country: '',
major_all: ''
},
{
realname: '',
email: '',
country: '',
major_all: ''
}
],
countrys: [],
fileL_articleApproval: [],
@@ -1165,6 +1089,47 @@ export default {
fileL_picturesAndTables: [],
fileL_manuscirpt: [],
fileL_supplementary: [],
tuiJianRules: {
realname: [
{
required: true,
message: 'Please enter a realname',
trigger: 'blur'
}
],
email: [
{
required: true,
message: 'Please enter a email',
trigger: 'blur'
},
{
validator: validateNotQQEmail, // 绑定自定义校验
trigger: 'blur'
}
],
department: [
{
required: true,
message: 'Please enter a department',
trigger: 'blur'
}
],
affiliation: [
{
required: true,
message: 'Please select a affiliation',
trigger: 'blur'
}
],
major_all: [
{
required: true,
message: 'Please select a Filed',
trigger: 'blur'
}
]
},
rules: {
journal: [
{
@@ -1357,7 +1322,7 @@ export default {
message: 'Please upload ethical approva file',
trigger: 'blur'
}
],
]
},
forWard: false,
authorVisible: false,
@@ -1416,6 +1381,7 @@ export default {
children: 'children'
},
tables: [],
uploadPercentage: 0,
wordimgList: [],
tablesHtml: [],
imagesHtml: []
@@ -1475,6 +1441,20 @@ export default {
}
},
methods: {
// 提交前校验所有评审人表单
async validateAllReviewers() {
// 遍历所有表单实例
for (const form of this.$refs.tuiJianForm) {
// 校验当前表单返回Promise
const valid = await form.validate().catch(() => false);
if (!valid) {
// 有表单未通过校验终止并返回false
return false;
}
}
// 所有表单校验通过
return true;
},
handleJournalSelected(journal) {
if (journal == '') {
this.check_item = {};
@@ -1482,7 +1462,7 @@ export default {
this.form.journal = '';
this.reviewerof.journal = 1;
console.log('this.form at line 1386:', this.form)
console.log('this.form at line 1386:', this.form);
if (localStorage.getItem('ms_journal_alias')) {
localStorage.removeItem('ms_journal_alias');
}
@@ -1491,13 +1471,20 @@ export default {
this.ch_Jour_all(journal.journal_id);
}
},
onSubmit() {
async onSubmit() {
if (!this.agreechecked) {
this.$message.error(
'Dear author, the licenses need to be accecpted before you submit the manuscript. You could find more information in http://creativecommons.org/licenses/by/4.0/'
);
return false;
}
// 校验所有评审人表单
const valid = await this.validateAllReviewers();
if (!valid) {
this.$message.error('Please fill in all reviewer information correctly!');
return false;
}
return;
this.$refs.articleform.validate((valid) => {
if (this.isAbstractTooShort(this.form.abstrart)) {
this.$message.error('The abstract should not be less than 200 words!');
@@ -1591,9 +1578,8 @@ export default {
this.$refs.tuiJianForm[i].validate((vali) => {
if (vali) {
tuijian_yanzheng += 0;
//this.tuiJianForm[i].major = this.tuiJianForm[i].major_all[0]
this.tuiJianForm[i].major = this.tuiJianForm[i].major_all[this.tuiJianForm[i].major_all.length - 1];
//this.tuiJianForm[i].cmajor = this.tuiJianForm[i].major_all[1]
} else {
tuijian_yanzheng += 1;
}
@@ -1933,7 +1919,15 @@ export default {
// 保存修改用户信息
saveAuthor(value) {
if (value.firstname == '' || value.lastname == '' || value.title == '' || value.Country == '' || value.email == ''||value.company == ''||value.orcid == '') {
if (
value.firstname == '' ||
value.lastname == '' ||
value.title == '' ||
value.Country == '' ||
value.email == '' ||
value.company == '' ||
value.orcid == ''
) {
this.$message.error('Please provide complete author information!');
return;
}
@@ -2323,10 +2317,16 @@ export default {
this.$message.error('service error' + res.msg);
}
},
// 进度回调:实时获取进度
handleProgress(event, file, fileList) {
this.isShowProgress=true
// event.percentage 就是当前进度(百分比,浮点数)
this.uploadPercentage = Math.round(event.percent); // 取整数
},
addWordTablesList(tables) {
console.log('tables at line 2187:', tables);
console.log('this.fileMesForm at line 2189:', this.stagingID);
var data = {
article_id: this.stagingID,
@@ -2336,21 +2336,23 @@ export default {
html_data: ''
}))
};
this.$api.post('api/Article/addArticleTable', data).then((res) => {
this.isShowCommonWord = true;
setTimeout(() => {
this.isShowProgress=false;
},500)
});
},
upLoadWordTables() {},
upSuccess_manuscirpt(res, File) {
// console.log('file at line 2174:', file.raw)
if (File) {
var that = this;
const reader = new FileReader();
reader.onload = function (e) {
that.$commonJS.extractWordTablesToArrays(File.raw, function (wordTables) {
console.log('tablesHtml at line 61:', wordTables);
return;
that.addWordTablesList(wordTables);
});
};
@@ -2555,7 +2557,7 @@ export default {
this.Reviewerof.journal = e;
this.checkReviewer();
this.form.journal = e;
this.$refs.articleform.clearValidate(['journal']);;
this.$refs.articleform.clearValidate(['journal']);
this.form.major = '';
this.form.major_a = '';
this.form.major_b = '';
@@ -2848,12 +2850,12 @@ export default {
}
});
} else if (e == 2) {
this.isShowCommonWord = false;
setTimeout(() => {
this.isShowCommonWord = true;
// that.getWordTablesList();
// that.getWordimgList();
}, 200);
// this.isShowCommonWord = false;
// setTimeout(() => {
// this.isShowCommonWord = true;
// // that.getWordTablesList();
// // that.getWordimgList();
// }, 200);
// for (let i = 0; i < this.form.authorList.length; i++) {
// if (this.form.authorList[i].art_aut_id == undefined) {
// this.form.authorList[i].art_aut_id = 0
@@ -2925,9 +2927,7 @@ export default {
.then((res) => {
if (res.code == 0) {
this.form.manuscirptId = res.data.file_id;
console.log('this.form.manuscirpt at line 2652:', this.form.manuscirpt);
console.log('1111111111111111111111111111');
setTimeout(() => {
// that.getWordTablesList();
// that.getWordimgList();
@@ -3123,7 +3123,7 @@ export default {
padding-bottom: 10px;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
width: calc(100% - 60px);
width: calc(100% - 20px);
/* margin-bottom: 10px; */
margin-top: 20px;
}
@@ -3501,7 +3501,7 @@ export default {
.tuijian_f > .shanchu_tj {
position: absolute;
right: 0;
top: 0;
top: 5px;
padding: 5px 10px;
}
@@ -3517,7 +3517,46 @@ export default {
.tuijian_f .el-form-item > .el-form-item__label:before {
content: '' !important;
}
/* 评审人表单容器 - 网格布局设置 */
.tuijian_f {
display: grid;
grid-template-columns: repeat(4, 1fr); /* 4列平均分布 */
gap: 10px; /* 字段间间距 */
/* padding:0 10px; */
border: 1px solid #eee; /* 可选:加个边框区分每个评审人表单 */
border-radius: 4px;
margin-bottom: 10px; /* 多个评审人表单之间的间距 */
}
/* 标题和删除按钮样式调整 */
.tuijian_f > p {
grid-column: 1 / -1; /* 标题占满整行 */
margin: 0 0 0px 0;
font-weight: 500;
padding: 0 6px;
}
.tuijian_f .shanchu_tj {
grid-column: 4 / 5; /* 删除按钮放在第4列 */
align-self: end; /* 靠下对齐 */
justify-self: end; /* 靠右对齐 */
}
/* Filed字段单独占一行 */
.tuijian_f .el-form-item:nth-child(6) {
/* 因为Filed是第6个表单项从p开始算第1个 */
grid-column: 1 / -1; /* 占满所有列(整行) */
}
/* 调整字段宽度和对齐(可选,根据需要微调) */
.tuijian_f .el-form-item {
margin-bottom: 0; /* 取消默认margin用grid的gap控制间距 */
}
.tuijian_f .el-input,
.tuijian_f .el-cascader {
width: 100% !important; /* 让输入框自适应网格列宽 */
}
.el-popover {
word-break: break-word;
text-align: left;

View File

@@ -185,7 +185,11 @@ export default {
}
},
mounted() {
if(JSON.stringify(this.check_item)!=='{}'){
this.selectedJournal = this.check_item;
}else{
this.selectedJournal = null;
}
this.getJournalList();
document.addEventListener('click', this.handleClickOutside);
},

View File

@@ -0,0 +1,133 @@
<template>
<div class="mask-layer">
<div class="progress-container">
<!-- 1. AI解析文章内容 -->
<div class="progress-item">
<div style="font-size: 24px;color: #fff;">AI 解析中</div>
<div class="progress-wrap">
<div class="progress-bar" :style="{ width: contentProgress + '%' }"></div>
<span class="progress-text" :style="Math.round(contentProgress) >96 ? 'color: #fff' : ''">{{ Math.round(contentProgress) }}%</span>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
progress: {
type: Number,
default: 0
}
},
data() {
return {
contentProgress: 0,
imageProgress: 0,
tableProgress: 0,
timers: []
};
},
mounted() {
this.contentProgress = this.progress;
// 优化:减小步长 + 缩短间隔,让更新更频繁、变化更细腻
this.startProgress('contentProgress', 0.8, 100); // 每次+0.8100ms更新一次
this.startProgress('imageProgress', 1.2, 100); // 每次+1.2100ms更新一次
this.startProgress('tableProgress', 1.0, 100); // 每次+1.0100ms更新一次
},
beforeDestroy() {
this.timers.forEach(timer => clearInterval(timer));
},
methods: {
close(){
this.$emit('close');
},
startProgress(progressKey, step, interval) {
const timer = setInterval(() => {
if (this[progressKey] < 100) {
// 保留小数点后1位精度避免整数跳跃感
this[progressKey] = Math.min(parseFloat((this[progressKey] + step).toFixed(1)), 100);
} else {
clearInterval(timer);
}
}, interval);
this.timers.push(timer);
}
}
};
</script>
<style scoped>
.mask-layer {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.6);
z-index: 1000;
display: flex;
align-items: center;
justify-content: center;
}
.progress-container {
width: 60%;
padding: 40px;
/* background-color: #fff; */
border-radius: 8px;
/* box-shadow: 0 0 15px rgba(0, 0, 0, 0.2); */
}
.progress-item {
margin-bottom: 25px;
display: flex;
align-items: center;
gap: 15px;
}
.progress-item span:first-child {
width: 140px;
font-size: 14px;
color: #333;
font-weight: 500;
}
.progress-wrap {
flex: 1;
height: 20px;
background-color: #f0f2f5;
border-radius: 8px;
overflow: hidden;
position: relative;
}
/* 核心优化:更柔和的过渡曲线 + 延长过渡时间 */
.progress-bar {
height: 100%;
background-color: #409eff;
transition: width 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); /* 缓动曲线更丝滑 */
background-image: linear-gradient(90deg, #409eff, #69b1ff); /* 轻微渐变增强质感 */
}
.progress-text {
position: absolute;
right: 8px;
top: 50%;
transform: translateY(-50%);
font-size: 16px;
color: #409eff;
font-weight: 500;
min-width: 24px;
text-align: right;
}
</style>

View File

@@ -41,7 +41,7 @@
<el-form class="ms-content" :rules="registerRules" ref="registerForm" :model="registerForm" label-width="0">
<!-- 用户名 -->
<el-form-item prop="username">
<el-input size="small" v-model="registerForm.username" auto-complete="off" placeholder="username">
<el-input size="small" v-model="registerForm.username" auto-complete="off" placeholder="user name">
<i slot="prefix" class="el-icon-user"></i>
</el-input>
</el-form-item>