This commit is contained in:
2025-03-28 16:23:44 +08:00
parent 9fb503757a
commit 852970da14
7 changed files with 212 additions and 30 deletions

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

View File

@@ -414,8 +414,15 @@ Information:'Fill in information',
},
Formula:{
FormulaTemplate:'Formula Template'
},
AI: {
AISummaryAnalysis: 'AI analysis',
AIKeywords: 'Keywords',
AIAbstract: 'Abstract',
AIAbstractInfo: 'Analysis Result',
}
}

View File

@@ -407,7 +407,13 @@ const zh = {
},
Formula:{
FormulaTemplate:'公式模版'
}
},
AI:{
AISummaryAnalysis:'AI分析',
AIKeywords:'关键词',
AIAbstract:'摘要',
AIAbstractInfo:'分析结果',
},
}

View File

@@ -1462,12 +1462,17 @@ export default {
return false;
}
this.$refs.articleform.validate((valid) => {
if (this.isAbstractTooShort(this.form.abstrart)) {
this.$message.error('The abstract should not be less than 200 Chinese characters or English words!');
return false;
}
//验证文档
if (this.form.manuscirpt == '') {
this.$message.error('Manuscirpt is required');
// console.log('file up error');
return false;
}
//验证作者
let authorlist = this.form.authorList;
let Firsta = 0;
@@ -1508,9 +1513,11 @@ export default {
this.$message.error('First author and corresponding author must be exist');
return false;
}
console.log('this.form.major at line 1512:', this.form.major);
//验证文章领域
this.form.major = this.majorValueList.map((item) => item.selectedValue[item.selectedValue.length - 1]).toString(',');
if (this.form.major == '') {
this.$message.error('Major is required');
this.$message.error('Please select the Research areas');
return false;
}
//验证选择转投但没选期刊项的情况
@@ -1613,7 +1620,17 @@ export default {
},
Submission_of_manuscripts() {
// 提交稿件
// 提交稿件AI检索
this.$api
// api/Article/addArticle
.post('api/Aireview/review', {
article_id: this.form.article_id,
abstrart: this.form.abstrart,
keywords: this.form.keyWords,
api_model: 'gpt-4o'
})
.then((res) => {});
this.$api
// api/Article/addArticle
.post('api/Article/addArticlePart4', this.form)

View File

@@ -5,7 +5,12 @@
<el-breadcrumb-item> <i class="el-icon-lx-calendar"></i> Manuscript detail </el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="container_state" v-loading="loading" style="margin: 20px 0 0 0">
<div class="container_state" v-loading="loading" style="margin: 10px 0 0 0">
<div style="margin-bottom: 10px; margin-top: 0px;overflow: hidden;" v-if="AIcontent!=''">
<img src="@/assets/img/ai.png" style="width: 30px; height: 30px; margin-right: 4px;float: left;margin-top: 10px;" />
<p class="beautiful-gradient"style="float: right;width: calc(100% - 40px);font-size: 13px;line-height: 16px;color: #1d45f2;" >{{ AIcontent }}</p>
</div>
<el-row :gutter="30">
<el-col :span="16">
<div class="art_state_">
@@ -127,18 +132,14 @@
</p>
</el-collapse-item>
</el-collapse>
<el-collapse class="auth_colla auth_collna_ew" style="margin-top: -15px;">
<el-collapse-item title="Research areas" name="1" >
<div style="position: relative;height: 30px;">
<common-major
:articleId="editform.articleId"
@load="initMajor()"
style="position: absolute; top: 10px; right: 10px"
></common-major>
<el-collapse class="auth_colla auth_collna_ew" style="margin-top: -15px">
<el-collapse-item title="Research areas" name="1">
<div style="position: relative; height: 30px">
<common-major
:articleId="editform.articleId"
@load="initMajor()"
style="position: absolute; top: 10px; right: 10px"
></common-major>
</div>
<div style="margin: 12px 20px 30px 0px; line-height: 24px; font-size: 14px; position: relative">
@@ -552,6 +553,7 @@ export default {
},
data() {
return {
AIcontent:'',
previewData: {},
baseUrl: this.Common.baseUrl,
mediaUrl: this.Common.mediaUrl,
@@ -672,6 +674,7 @@ export default {
};
},
created: function () {
this.getAi();
this.initarticle();
this.initFileList();
@@ -807,6 +810,18 @@ export default {
}
},
methods: {
async getAi(){
var that = this;
await this.$api
.post('api/Aireview/get', {
article_id: this.$route.query.id
})
.then(async (res) => {
console.log('res at line 819:', res)
this.AIcontent = res.data.content?res.data.content:'';
});
},
async getWordimgList() {
var that = this;
await this.$api
@@ -1473,4 +1488,21 @@ export default {
::v-deep .el-drawer__wrapper .WACContainer {
z-index: 10000 !important;
}
.beautiful-gradient {
background: linear-gradient(135deg, #f0f9fe, #dce6ff, #d7e9fd);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.01);
border-radius: 16px;
padding: 10px;
box-sizing: border-box;
color: #333;
font-family: "Segoe UI", sans-serif;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.beautiful-gradient:hover {
transform: translateY(-4px);
box-shadow: 0 12px 30px rgba(0, 0, 0, 0.15);
}
</style>

View File

@@ -52,7 +52,19 @@
<el-button type="primary" icon="el-icon-search" @click="handleSearch" style="margin: 0 0 10px 0">Search </el-button>
</div>
<div v-if="!PreAcpVisible">
<div v-for="(item, ikgn) in tableData" class="mangu_list">
<div v-for="(item, ikgn) in tableData" class="mangu_list" style="position: relative">
<img
v-if="item.ai_review != '' && item.ai_review"
src="@/assets/img/ai.png"
@click="openAI(item)"
style="cursor: pointer; width: 30px; height: 30px; position: absolute; right: 6px; top: 6px"
/>
<img
v-else
src="@/assets/img/ai.png"
@click="creatAI(item,ikgn)"
style="opacity: 0.5; cursor: pointer; width: 30px; height: 30px; position: absolute; right: 6px; top: 6px"
/>
<div>
<font style="color: #666b7a">ID : </font>
<span
@@ -253,7 +265,7 @@
<div v-if="item.reportList.length > 0" style="text-align: left">
<div v-for="(v, i) in item.reportList" style="margin-top: 10px; overflow: hidden">
<div style="display: flex; align-items: center; justify-content: space-between">
<div style="display: flex; align-items: center;">
<div style="display: flex; align-items: center">
<span
style="
float: left;
@@ -268,14 +280,20 @@
"
><i class="el-icon-s-custom"></i
></span>
<span style="max-width:80%;white-space: nowrap;display: inline-block;
overflow: hidden;
text-overflow: ellipsis;">{{ v.author_account.realname }}</span>
<span
style="
max-width: 80%;
white-space: nowrap;
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
"
>{{ v.author_account.realname }}</span
>
</div>
<div style="max-width:260px;width:auto;">
<div style="max-width: 260px; width: auto">
<span style="margin-left: 6px" v-if="v.author_account.wos_time">
<span style="font-size: 12px; font-weight: bold">WOS</span> :
<span v-html="colorIndex1(v.author_account.wos_index)"></span>
@@ -961,7 +979,7 @@
"
>
<el-button type="primary" @click="saveUserIndex(userIndexForm)" style="float: right">{{ $t('citeList.save') }}</el-button>
<el-button style="float: right; margin-right: 20px" @click="aiSorbox=false">{{ $t('citeList.cancel') }}</el-button>
<el-button style="float: right; margin-right: 20px" @click="aiSorbox = false">{{ $t('citeList.cancel') }}</el-button>
</div>
</el-drawer>
@@ -1112,6 +1130,34 @@
</div>
</div>
</el-dialog>
<el-dialog :title="$t('AI.AISummaryAnalysis')" :visible.sync="isShowAI" width="50%" class="AIDialog">
<div class="AISummaryAnalysis">
<el-collapse class="auth_colla auth_collna_ew" style="margin-bottom: 0">
<el-collapse-item name="1">
<template slot="title">
Abstract
<font v-if="currentArticleData.keywords" style="margin-left: 3px">, Keywords</font>
</template>
<p>
<font>Abstract :</font><b>{{ currentArticleData.abstrart }}</b>
</p>
<p v-if="currentArticleData.keywords">
<font>Keywords :</font><b>{{ currentArticleData.keywords }}</b>
</p>
</el-collapse-item>
</el-collapse>
<p style="line-height: 20px">
<span>{{ $t('AI.AIAbstractInfo') }} :</span>
{{ currentArticleData.ai_review }}
</p>
</div>
<span slot="footer" class="dialog-footer">
<!-- <el-button @click="isShowAI = false">取 消</el-button> -->
<el-button type="primary" @click="isShowAI = false">Close</el-button>
</span>
</el-dialog>
</div>
</template>
@@ -1124,6 +1170,8 @@ export default {
},
data() {
return {
isShowAI: false,
currentArticleData: {},
rules: {},
userloading: false,
curState: null,
@@ -1279,6 +1327,37 @@ export default {
}
},
methods: {
openAI(data) {
this.isShowAI = true;
this.currentArticleData = { ...data };
console.log('this.currentArticleData at line 1312:', this.currentArticleData);
},
creatAI(data,i){
const loading = this.$loading({
lock: true,
text: 'Loading...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
console.log('data at line 1336:', data)
this.$api
// api/Article/addArticle
.post('api/Aireview/review', {
article_id: data.article_id,
})
.then((res) => {
if(res.data.content){
this.tableData[i].ai_review=res.data.content
loading.close()
this.openAI({...data,ai_review:res.data.content});
}
}).catch((err) => {
loading.close()
this.$message.error('AI analysis failed')
})
},
// 保存个人信息
saveUserIndex() {
let link_geo = '';
@@ -1802,7 +1881,9 @@ export default {
typeName = 'Google';
index = this.userMessage.google_time != 0 ? this.userMessage.google_index : '';
date = this.userMessage.google_time;
website =this.userMessage.g_author?`https://scholar.google.com/citations?hl=en&user=${this.userMessage.g_author}`:'';
website = this.userMessage.g_author
? `https://scholar.google.com/citations?hl=en&user=${this.userMessage.g_author}`
: '';
editor = this.userMessage.google_editor;
g_author = this.userMessage.g_author;
this.bankVisible = false;
@@ -2704,4 +2785,42 @@ export default {
.userIndexBox .s_rol > div.rol_mess > font {
width: auto;
}
.AISummaryAnalysis p {
margin-top: 10px;
font-size: 14px;
padding-left: 10px;
box-sizing: border-box;
}
.AISummaryAnalysis p span {
display: inline-block;
width: auto;
color: #6157fd;
font-weight: bold;
}
::v-deep .AIDialog .el-dialog__body {
padding: 20px !important;
}
::v-deep .AIDialog .el-dialog__body .auth_collna_ew .el-collapse-item__arrow {
padding-left: 0px !important;
}
::v-deep .AIDialog .el-dialog__body .auth_collna_ew .el-collapse-item__header {
padding-left: 30px !important;
}
::v-deep .AIDialog .el-dialog {
/* background: linear-gradient(135deg, #f0f9fe, #dce6ff, #d7e9fd) !important;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.01) !important;
border-radius: 16px !important;
padding: 10px !important;
box-sizing: border-box !important;
color: #333 !important;
font-family: "Segoe UI", sans-serif !important;
transition: transform 0.3s ease, box-shadow 0.3s ease !important; */
}
.beautiful-gradient {
}
.beautiful-gradient:hover {
transform: translateY(-4px);
box-shadow: 0 12px 30px rgba(0, 0, 0, 0.15);
}
</style>

View File

@@ -58,7 +58,8 @@ export default {
watch: {
list: {
handler(e) {
this.fields=[...this.list]
this.fields=this.list.length>0?[...this.list]:[{}]
},
immediate: true
},