|
|
|
|
@ -1,109 +1,113 @@ |
|
|
|
|
<template> |
|
|
|
|
<div class="ai-pages row"> |
|
|
|
|
<VMenu menuIndex="1"></VMenu> |
|
|
|
|
<div class="ai-pages-back" @click="gotoBack"><i class="iconfont icon-return"></i></div> |
|
|
|
|
<main class="ai-pages-main row"> |
|
|
|
|
|
|
|
|
|
<!-- 对话左侧 --> |
|
|
|
|
<div class="ai-edit-left col m-r-large v-overflow-y" v-loading="generatedLoading" |
|
|
|
|
element-loading-text="请稍后,正文生成中..."> |
|
|
|
|
<div class="ai-show-btn show" @click="showPage = !showPage"><i class="el-icon-arrow-right"></i></div> |
|
|
|
|
<div class="ai-edit-content" v-html="generatedContent" v-if="!editorState"></div> |
|
|
|
|
<ckeditor :editor="editor" v-model="generatedEdit" :config="editorConfig" style="height:500px" /> |
|
|
|
|
<div class="v-edit-tool"> |
|
|
|
|
<div class="v-edit-tool-item down" @click="downLoadDoc"><i class="iconfont icon-down"></i></div> |
|
|
|
|
<div class="v-edit-tool-item refresh" @click="refreshDoc"><i class="iconfont icon-refresh"></i></div> |
|
|
|
|
<div class="ai-pages row"> |
|
|
|
|
<VMenu menuIndex="1"></VMenu> |
|
|
|
|
<div class="ai-pages-back" @click="gotoBack"><i class="iconfont icon-return"></i></div> |
|
|
|
|
<main class="ai-pages-main row"> |
|
|
|
|
|
|
|
|
|
<!-- 对话左侧 --> |
|
|
|
|
<div class="ai-edit-left col m-r-large v-overflow-y" v-loading="generatedLoading" |
|
|
|
|
element-loading-text="请稍后,正文生成中..."> |
|
|
|
|
<div class="ai-show-btn show" @click="showPage = !showPage"><i class="el-icon-arrow-right"></i></div> |
|
|
|
|
<div class="ai-edit-content" v-html="generatedContent" v-if="!editorState"></div> |
|
|
|
|
<ckeditor :editor="editor" v-model="generatedEdit" :config="editorConfig" style="height:500px"/> |
|
|
|
|
<div class="v-edit-tool"> |
|
|
|
|
<div class="v-edit-tool-item down" @click="downLoadDoc"><i class="iconfont icon-down"></i></div> |
|
|
|
|
<div class="v-edit-tool-item refresh" @click="refreshDoc"><i class="iconfont icon-refresh"></i></div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<!-- 对话右侧 --> |
|
|
|
|
<div class="ai-edit-right m-r-large" :class="showPage ? 'show' : 'hide'"> |
|
|
|
|
<!-- 对话 表单 --> |
|
|
|
|
<div class="ai-edit-right-form"> |
|
|
|
|
<div class="v-ecode-form v-overflow-y"> |
|
|
|
|
<el-form ref="formRef" :model="form" label-width="80px" size="small" :rules="rules"> |
|
|
|
|
<el-form-item label="" class="v-item-block" label-width="0"> |
|
|
|
|
<el-cascader @change="getModelCascader" :disabled="generatedLoading" class="v-cascader" |
|
|
|
|
popper-class="v-cascader-popper inline" style="width: 100%" v-model="form.model" |
|
|
|
|
:options="modelOptions"></el-cascader> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-tabs v-model="form.type" @tab-click="getDocumentList" class="v-tabs"> |
|
|
|
|
<el-tab-pane :label="item.label" :name="item.value" v-for="(item, index) in DocumentType" |
|
|
|
|
:key="index"></el-tab-pane> |
|
|
|
|
</el-tabs> |
|
|
|
|
<el-form-item label="" class="v-item-block" label-width="0"> |
|
|
|
|
<el-select v-model="form.subType" placeholder="请选择" class="v-select" style="width: 100%" |
|
|
|
|
popper-class="v-select-popper inline" :disabled="generatedLoading"> |
|
|
|
|
<el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value"> |
|
|
|
|
<span style="float: left">{{ item.label }}</span> |
|
|
|
|
</el-option> |
|
|
|
|
</el-select> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="公文标题" class="v-item-block"> |
|
|
|
|
<el-input v-model="form.title" class="v-input" :disabled="generatedLoading"></el-input> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="主题词" class="v-item-block" prop="keywords"> |
|
|
|
|
<el-tooltip class="item" effect="dark" content="输入多个关键字时,请使用中文逗号(,)隔开。" placement="top"> |
|
|
|
|
<i class="v-edit-tip el-icon-question"></i> |
|
|
|
|
</el-tooltip> |
|
|
|
|
<el-input v-model="form.keywords" type="textarea" :rows="2" class="v-textarea" resize="none" |
|
|
|
|
:disabled="generatedLoading"></el-input> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item :label="activeName == 'first' ? '补充说明' : '我是'" class="v-item-block"> |
|
|
|
|
<el-input v-model="form.supplementary" type="textarea" :rows="2" class="v-textarea" |
|
|
|
|
:disabled="generatedLoading" resize="none"></el-input> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="内容篇幅" class="v-item-inline flex-align-center"> |
|
|
|
|
<el-radio-group v-model="form.length" class="v-radio-group" :disabled="generatedLoading"> |
|
|
|
|
<el-radio :label="0">短篇</el-radio> |
|
|
|
|
<el-radio :label="1">中篇</el-radio> |
|
|
|
|
<el-radio :label="2">长篇</el-radio> |
|
|
|
|
</el-radio-group> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="参考资料" class="v-item-inline"> |
|
|
|
|
<div class="text-right color-primary"> |
|
|
|
|
<FileUpload ref="upload" :limit="1" :file-type="['png', 'jpg', 'jpeg', 'doc', 'docx']" |
|
|
|
|
@input="handleReferenceChange"> |
|
|
|
|
<i class="el-icon-document"></i>上传资料 |
|
|
|
|
</FileUpload> |
|
|
|
|
<!-- 对话右侧 --> |
|
|
|
|
<div class="ai-edit-right m-r-large" :class="showPage ? 'show' : 'hide'"> |
|
|
|
|
<!-- 对话 表单 --> |
|
|
|
|
<div class="ai-edit-right-form"> |
|
|
|
|
<div class="v-ecode-form v-overflow-y"> |
|
|
|
|
<el-form ref="formRef" :model="form" label-width="80px" size="small" :rules="rules"> |
|
|
|
|
<el-form-item label="" class="v-item-block" label-width="0"> |
|
|
|
|
<el-cascader @change="getModelCascader" :disabled="generatedLoading" class="v-cascader" |
|
|
|
|
popper-class="v-cascader-popper inline" style="width: 100%" v-model="form.model" |
|
|
|
|
:options="modelOptions"></el-cascader> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-tabs v-model="form.type" @tab-click="getDocumentList" class="v-tabs"> |
|
|
|
|
<el-tab-pane :label="item.label" :name="item.value" v-for="(item, index) in DocumentType" |
|
|
|
|
:key="index"></el-tab-pane> |
|
|
|
|
</el-tabs> |
|
|
|
|
<el-form-item label="" class="v-item-block" label-width="0"> |
|
|
|
|
<el-select v-model="form.subType" placeholder="请选择" class="v-select" style="width: 100%" |
|
|
|
|
popper-class="v-select-popper inline" :disabled="generatedLoading"> |
|
|
|
|
<el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value"> |
|
|
|
|
<span style="float: left">{{ item.label }}</span> |
|
|
|
|
</el-option> |
|
|
|
|
</el-select> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="公文标题" class="v-item-block"> |
|
|
|
|
<el-input v-model="form.title" class="v-input" :disabled="generatedLoading"></el-input> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="主题词" class="v-item-block" prop="keywords"> |
|
|
|
|
<el-tooltip class="item" effect="dark" content="输入多个关键字时,请使用中文逗号(,)隔开。" |
|
|
|
|
placement="top"> |
|
|
|
|
<i class="v-edit-tip el-icon-question"></i> |
|
|
|
|
</el-tooltip> |
|
|
|
|
<el-input v-model="form.keywords" type="textarea" :rows="2" class="v-textarea" resize="none" |
|
|
|
|
:disabled="generatedLoading"></el-input> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item :label="activeName == 'first' ? '补充说明' : '我是'" class="v-item-block"> |
|
|
|
|
<el-input v-model="form.supplementary" type="textarea" :rows="2" class="v-textarea" |
|
|
|
|
:disabled="generatedLoading" resize="none"></el-input> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="内容篇幅" class="v-item-inline flex-align-center"> |
|
|
|
|
<el-radio-group v-model="form.length" class="v-radio-group" :disabled="generatedLoading"> |
|
|
|
|
<el-radio :label="0">短篇</el-radio> |
|
|
|
|
<el-radio :label="1">中篇</el-radio> |
|
|
|
|
<el-radio :label="2">长篇</el-radio> |
|
|
|
|
</el-radio-group> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="参考资料" class="v-item-inline"> |
|
|
|
|
<div class="text-right color-primary"> |
|
|
|
|
<FileUpload ref="upload" :limit="1" :file-type="['png', 'jpg', 'jpeg', 'doc', 'docx']" |
|
|
|
|
@input="handleReferenceChange"> |
|
|
|
|
<i class="el-icon-document"></i>上传资料 |
|
|
|
|
</FileUpload> |
|
|
|
|
</div> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="仿写资料" class="v-item-inline"> |
|
|
|
|
<div class="text-right color-primary"> |
|
|
|
|
<FileUpload ref="upload1" :limit="1" :file-type="['png', 'jpg', 'jpeg', 'doc', 'docx']" |
|
|
|
|
@input="handleImitationChange"> |
|
|
|
|
<i class="el-icon-document"></i>上传资料 |
|
|
|
|
</FileUpload> |
|
|
|
|
</div> |
|
|
|
|
</el-form-item> |
|
|
|
|
</el-form> |
|
|
|
|
<!-- skType 1深度思考 2普通问答 --> |
|
|
|
|
<div class="ai-ecode-content" v-if="skType == 1"> |
|
|
|
|
<div class="ai-ecode-msg"> |
|
|
|
|
<div class="ai-ecode-msg-title"><img src="@/assets/ai-images/aie.png" class="ai-ecode-msg-title-img"/> |
|
|
|
|
<div class="ai-ecode-msg-title-txt" v-if="thinkState">已深度思考,耗时{{ thinkTimes }}秒</div> |
|
|
|
|
<div class="ai-ecode-msg-title-txt think" v-else>思考中</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</el-form-item> |
|
|
|
|
<el-form-item label="仿写资料" class="v-item-inline"> |
|
|
|
|
<div class="text-right color-primary"> |
|
|
|
|
<FileUpload ref="upload1" :limit="1" :file-type="['png', 'jpg', 'jpeg', 'doc', 'docx']" |
|
|
|
|
@input="handleImitationChange"> |
|
|
|
|
<i class="el-icon-document"></i>上传资料 |
|
|
|
|
</FileUpload> |
|
|
|
|
<div class="ai-ecode-think" ref="docCcontent"> |
|
|
|
|
<div class="ai-ecode-content-wrapper" v-html="reasoningContent"></div> |
|
|
|
|
</div> |
|
|
|
|
</el-form-item> |
|
|
|
|
</el-form> |
|
|
|
|
<!-- skType 1深度思考 2普通问答 --> |
|
|
|
|
<div class="ai-ecode-content" v-if="skType == 1"> |
|
|
|
|
<div class="ai-ecode-msg"> |
|
|
|
|
<div class="ai-ecode-msg-title"><img src="@/assets/ai-images/aie.png" class="ai-ecode-msg-title-img" /> |
|
|
|
|
<div class="ai-ecode-msg-title-txt" v-if="thinkState">已深度思考,耗时{{ thinkTimes }}秒</div> |
|
|
|
|
<div class="ai-ecode-msg-title-txt think" v-else>思考中</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="ai-ecode-think" ref="docCcontent"> |
|
|
|
|
<div class="ai-ecode-content-wrapper" v-html="reasoningContent"></div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="ai-ecode-bot" style="background-color: #ffff"> |
|
|
|
|
<el-button type="primary" size="small" style="width: 100%;" @click="generateDoc()" |
|
|
|
|
:disabled="generatedLoading">立即生成 |
|
|
|
|
</el-button> |
|
|
|
|
<div class="ai-ecode-bot" style="background-color: #ffff"> |
|
|
|
|
<el-button type="primary" size="small" style="width: 100%;" @click="generateDoc()" |
|
|
|
|
:disabled="generatedLoading">立即生成 |
|
|
|
|
</el-button> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</main> |
|
|
|
|
</div> |
|
|
|
|
</main> |
|
|
|
|
</div> |
|
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
<script> |
|
|
|
|
import FileUpload from '@/components/FileUpload' |
|
|
|
|
import FileUpload1 from '@/components/FileUpload1' |
|
|
|
|
|
|
|
|
|
import htmlDocx from 'html-docx-js/dist/html-docx'; |
|
|
|
|
import FileSaver from 'file-saver'; |
|
|
|
|
|
|
|
|
|
import * as AiApi from '@/api/ai-api' |
|
|
|
|
|
|
|
|
|
const { |
|
|
|
|
@ -153,12 +157,12 @@ const { |
|
|
|
|
TextTransformation, |
|
|
|
|
|
|
|
|
|
} = CKEDITOR; |
|
|
|
|
const { FormatPainter } = CKEDITOR_PREMIUM_FEATURES; |
|
|
|
|
const {FormatPainter} = CKEDITOR_PREMIUM_FEATURES; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export default { |
|
|
|
|
name: 'DocumentCorrectionDialog', |
|
|
|
|
components: { FileUpload, FileUpload1 }, |
|
|
|
|
components: {FileUpload, FileUpload1}, |
|
|
|
|
data() { |
|
|
|
|
return { |
|
|
|
|
editor: ClassicEditor, |
|
|
|
|
@ -268,7 +272,7 @@ export default { |
|
|
|
|
}, |
|
|
|
|
rules: { |
|
|
|
|
keywords: [ |
|
|
|
|
{ required: true, message: '请输入主题词', trigger: 'blur' }, |
|
|
|
|
{required: true, message: '请输入主题词', trigger: 'blur'}, |
|
|
|
|
] |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
@ -299,16 +303,15 @@ export default { |
|
|
|
|
}, |
|
|
|
|
mounted() { |
|
|
|
|
let params |
|
|
|
|
console.log(this.$route.params.data) |
|
|
|
|
|
|
|
|
|
if (this.$route.params.data) { |
|
|
|
|
params = this.$route.params.data |
|
|
|
|
localStorage.setItem('fileData', params); |
|
|
|
|
localStorage.setItem('fileData', JSON.stringify(params)); |
|
|
|
|
} else { |
|
|
|
|
params = localStorage.getItem('fileData') |
|
|
|
|
params = JSON.parse(localStorage.getItem('fileData')) |
|
|
|
|
} |
|
|
|
|
this.form.type = params.type |
|
|
|
|
this.form.subType = params.docType |
|
|
|
|
|
|
|
|
|
this.form.title = params.title |
|
|
|
|
this.form.keywords = params.keywords |
|
|
|
|
this.form.first = params.first |
|
|
|
|
@ -327,7 +330,7 @@ export default { |
|
|
|
|
}, |
|
|
|
|
downloadTextAsFile(text, fileName) { |
|
|
|
|
// 创建一个Blob对象,将文本内容转换为Blob |
|
|
|
|
var blob = new Blob([text], { type: 'application/msword;charset=utf-8' }); |
|
|
|
|
var blob = new Blob([text], {type: 'application/msword;charset=utf-8'}); |
|
|
|
|
// 创建一个下载链接 |
|
|
|
|
var downloadLink = document.createElement('a'); |
|
|
|
|
downloadLink.href = URL.createObjectURL(blob); |
|
|
|
|
@ -398,6 +401,7 @@ export default { |
|
|
|
|
}, |
|
|
|
|
/** 模型列表 值 */ |
|
|
|
|
getModelCascader(val) { |
|
|
|
|
this.thinkTimes = 0 |
|
|
|
|
let model = this.modelOptions.find((item, index) => { |
|
|
|
|
return item.value == val[0] |
|
|
|
|
}) |
|
|
|
|
@ -412,16 +416,14 @@ export default { |
|
|
|
|
this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错 |
|
|
|
|
}, |
|
|
|
|
handleReferenceChange(file) { |
|
|
|
|
console.log(file) |
|
|
|
|
this.form.referenceDocumentId = file |
|
|
|
|
}, |
|
|
|
|
handleImitationChange(file) { |
|
|
|
|
console.log(file) |
|
|
|
|
this.form.imitationDocumentId = file |
|
|
|
|
}, |
|
|
|
|
/** 生成 公文 */ |
|
|
|
|
async generateDoc() { |
|
|
|
|
|
|
|
|
|
this.thinkState = false |
|
|
|
|
try { |
|
|
|
|
await this.$refs['formRef'].validate() |
|
|
|
|
this.generatedContent = ''; |
|
|
|
|
@ -432,11 +434,7 @@ export default { |
|
|
|
|
this.generatedLoading = true |
|
|
|
|
this.errorMessage = ''; |
|
|
|
|
// skType 1深度思考 2普通问答 |
|
|
|
|
if (this.skType == 1) { |
|
|
|
|
this.thinkStart = true |
|
|
|
|
} else { |
|
|
|
|
this.thinkStart = false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
this.startTime = this.endTime = new Date(); |
|
|
|
|
this.thinkTimes = this.endTime.getTime() - this.startTime.getTime(); |
|
|
|
|
let versionId = this.modelOptions.find((item, index) => { |
|
|
|
|
@ -448,7 +446,6 @@ export default { |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
let subType = this.typeList.find((item) => { |
|
|
|
|
console.log(item,this.form.subType) |
|
|
|
|
return item.value == this.form.subType |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
@ -466,7 +463,6 @@ export default { |
|
|
|
|
referenceDocumentId: this.form.referenceDocumentId,//参考资料 |
|
|
|
|
imitationDocumentId: this.form.imitationDocumentId,//仿写资料 |
|
|
|
|
}; |
|
|
|
|
console.log(params) |
|
|
|
|
this.eventSource = await AiApi.chatStream(params); |
|
|
|
|
|
|
|
|
|
this.eventSource.onmessage = (event) => { |
|
|
|
|
@ -478,6 +474,7 @@ export default { |
|
|
|
|
this.editorState = true |
|
|
|
|
this.generatedEdit = this.generatedContent |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.closeConnection(); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
@ -488,7 +485,6 @@ export default { |
|
|
|
|
|
|
|
|
|
// 处理思维链内容 |
|
|
|
|
if (delta.reasoning_content) { |
|
|
|
|
this.thinkState = true |
|
|
|
|
this.reasoningContent += delta.reasoning_content; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -499,7 +495,9 @@ export default { |
|
|
|
|
let deepTime = Math.abs(this.endTime.getTime() - this.startTime.getTime()); |
|
|
|
|
this.thinkTimes = (deepTime / 1000).toFixed(2) |
|
|
|
|
} |
|
|
|
|
this.thinkState = false |
|
|
|
|
if(this.skType==1){ |
|
|
|
|
this.thinkState = true |
|
|
|
|
}else{this.thinkState = false} |
|
|
|
|
this.generatedContent += delta.content; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|