|
|
@@ -1,13 +1,14 @@
|
|
|
<!-- 章节编辑器 -->
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { computed, ref, watch, type PropType } from 'vue';
|
|
|
+import { ref, watch, type PropType } from 'vue';
|
|
|
import { EditOutlined, DownOutlined } from '@ant-design/icons-vue';
|
|
|
+import { marked } from "marked";
|
|
|
import type { Chapter } from '@/types/report.types';
|
|
|
import ContentEditor from "../components/ContentEditor.vue";
|
|
|
import ReferenceDraw from "../components/reference/ReferenceDraw.vue";
|
|
|
-import { useRoute } from 'vue-router';
|
|
|
-import * as testService from "@/services/test.service"
|
|
|
+import AIContentDraw from "../components/reference/AIContentDraw.vue";
|
|
|
+import * as aiService from "@/services/ai.service"
|
|
|
import { message } from 'ant-design-vue';
|
|
|
|
|
|
const props = defineProps({
|
|
|
@@ -30,10 +31,6 @@ const props = defineProps({
|
|
|
}
|
|
|
});
|
|
|
|
|
|
-const route = useRoute()
|
|
|
-
|
|
|
-const isAI = computed(() => route.query.ai)
|
|
|
-
|
|
|
const titleEditor = ref<HTMLInputElement | null>(null);
|
|
|
|
|
|
const titleEditing = ref(false);
|
|
|
@@ -51,6 +48,8 @@ const fullTitle = ref('');
|
|
|
const referenceDraw = ref<InstanceType<typeof ReferenceDraw> | null>(null);
|
|
|
// 内容编辑器组件ref
|
|
|
const contentEditor = ref<InstanceType<typeof ContentEditor> | null>(null)
|
|
|
+// AI内容展示组件ref
|
|
|
+const aiContentDraw = ref<InstanceType<typeof ReferenceDraw> | null>(null);
|
|
|
|
|
|
const emits = defineEmits<{
|
|
|
(e: "update:data", data: Chapter): void;
|
|
|
@@ -87,12 +86,12 @@ function onEditKeywords() {
|
|
|
|
|
|
function onTitleChange() {
|
|
|
titleEditing.value = false;
|
|
|
- emits("change", {...props.data, title: fullTitle.value})
|
|
|
+ emits("change", { ...props.data, title: fullTitle.value })
|
|
|
}
|
|
|
|
|
|
function onKeywordsChange() {
|
|
|
keywordsEditing.value = false;
|
|
|
- emits("change", {...props.data, keywords: keywordsInChapter.value.split(",")})
|
|
|
+ emits("change", { ...props.data, keywords: keywordsInChapter.value.split(",") })
|
|
|
}
|
|
|
|
|
|
function onTitleChangeCancel() {
|
|
|
@@ -100,13 +99,13 @@ function onTitleChangeCancel() {
|
|
|
titleEditing.value = false;
|
|
|
}
|
|
|
|
|
|
-function onKeywordsChangeCancel(){
|
|
|
+function onKeywordsChangeCancel() {
|
|
|
keywordsInChapter.value = props.data.keywords.join(",");
|
|
|
keywordsEditing.value = false;
|
|
|
}
|
|
|
|
|
|
function onContentChange(value: string) {
|
|
|
- emits("change", {...props.data, content: value});
|
|
|
+ emits("change", { ...props.data, content: value });
|
|
|
}
|
|
|
|
|
|
function onMenuClick(e: { key: string }) {
|
|
|
@@ -139,17 +138,14 @@ function onSectionRecordUse(sectionId: number) {
|
|
|
emits("sectionRecordUse", sectionId)
|
|
|
}
|
|
|
|
|
|
-function notifyRepetitiveWarning(data: boolean){
|
|
|
+function notifyRepetitiveWarning(data: boolean) {
|
|
|
repetitiveWarning.value = data;
|
|
|
}
|
|
|
|
|
|
function test1() {
|
|
|
- const loadingHandler = message.loading({content: 'AI正在撰写章节内容,请稍等……', duration: 0})
|
|
|
- const prompt = `根据R&D报告的标题、章节标题和关键词续写章节内容:\n` +
|
|
|
- `标题:${props.title}\n`+
|
|
|
- `章节标题:${props.data.title}\n关键词:${props.data.keywords}\n续写:`
|
|
|
- testService.test1(prompt).then((resp) => {
|
|
|
- onContentChange(resp)
|
|
|
+ const loadingHandler = message.loading({ content: 'AI正在撰写章节内容,请稍等……', duration: 0 })
|
|
|
+ aiService.generate(props.title, props.reportKeywords || '', props.data.title).then((resp) => {
|
|
|
+ onContentChange(marked.parse(resp))
|
|
|
if (loadingHandler) {
|
|
|
loadingHandler()
|
|
|
}
|
|
|
@@ -171,15 +167,8 @@ defineExpose({
|
|
|
<a-row type="flex" justify="space-between">
|
|
|
<a-col>
|
|
|
<a-space>
|
|
|
- <a-input
|
|
|
- v-if="titleEditing"
|
|
|
- v-model:value="fullTitle"
|
|
|
- @blur="onTitleChange"
|
|
|
- @pressEnter="onTitleChange"
|
|
|
- @keyup.esc="onTitleChangeCancel"
|
|
|
- ref="titleEditor"
|
|
|
- class="title-editor"
|
|
|
- />
|
|
|
+ <a-input v-if="titleEditing" v-model:value="fullTitle" @blur="onTitleChange" @pressEnter="onTitleChange"
|
|
|
+ @keyup.esc="onTitleChangeCancel" ref="titleEditor" class="title-editor" />
|
|
|
<h1 v-else>
|
|
|
<span>{{ data.fullTitle }}</span>
|
|
|
</h1>
|
|
|
@@ -192,20 +181,10 @@ defineExpose({
|
|
|
<h1>
|
|
|
<span>章节关键词:</span><span v-if="!keywordsEditing">{{ data.keywords.join(', ') }}</span>
|
|
|
</h1>
|
|
|
- <a-input
|
|
|
- v-if="keywordsEditing"
|
|
|
- v-model:value="keywordsInChapter"
|
|
|
- @blur="onKeywordsChange"
|
|
|
- @pressEnter="onKeywordsChange"
|
|
|
- @keyup.esc="onKeywordsChangeCancel"
|
|
|
- ref="keywordsEditor"
|
|
|
- class="keywords-editor"
|
|
|
- />
|
|
|
- <a-button
|
|
|
- type="text"
|
|
|
- @click="onEditKeywords"
|
|
|
- class="edit-btn"
|
|
|
- ><edit-outlined /></a-button>
|
|
|
+ <a-input v-if="keywordsEditing" v-model:value="keywordsInChapter" @blur="onKeywordsChange"
|
|
|
+ @pressEnter="onKeywordsChange" @keyup.esc="onKeywordsChangeCancel" ref="keywordsEditor"
|
|
|
+ class="keywords-editor" />
|
|
|
+ <a-button type="text" @click="onEditKeywords" class="edit-btn"><edit-outlined /></a-button>
|
|
|
</a-space>
|
|
|
</a-col>
|
|
|
<a-col>
|
|
|
@@ -224,25 +203,19 @@ defineExpose({
|
|
|
</a-dropdown>
|
|
|
</a-col>
|
|
|
</a-row>
|
|
|
- <p v-if="contentEditorVisible" :class="{'repetitiveWarning': repetitiveWarning}">
|
|
|
+ <p v-if="contentEditorVisible" :class="{ 'repetitiveWarning': repetitiveWarning }">
|
|
|
<ContentEditor :data="data.content || ''" @change="onContentChange" ref="contentEditor" />
|
|
|
</p>
|
|
|
<div class="chapter-button-group" v-if="contentEditorVisible">
|
|
|
<a-space>
|
|
|
- <a-button @click="searchReference">查找参考文献</a-button>
|
|
|
- <a-button :disabled="!isAI" @click="test1">自动生成(二期)</a-button>
|
|
|
+ <a-button @click="test1">AI生成</a-button>
|
|
|
+ <a-button @click="searchReference">匹配文献</a-button>
|
|
|
</a-space>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <ReferenceDraw
|
|
|
- :report-name="title"
|
|
|
- :reportKeywords="reportKeywords || ''"
|
|
|
- :chapter-keywords="data.keywords || []"
|
|
|
- ref="referenceDraw"
|
|
|
- @insert="onInsert"
|
|
|
- @close="onReferenceDrawClose"
|
|
|
- @recordUse="onSectionRecordUse"
|
|
|
- />
|
|
|
+ <ReferenceDraw :report-name="title" :reportKeywords="reportKeywords || ''" :chapter-keywords="data.keywords || []"
|
|
|
+ ref="referenceDraw" @insert="onInsert" @close="onReferenceDrawClose" @recordUse="onSectionRecordUse" />
|
|
|
+ <AIContentDraw content="''" ref="aiContentDraw" />
|
|
|
<!--删除章节 start -->
|
|
|
<a-modal v-model:visible="visible" title="删除章节" @ok="handleOk">
|
|
|
<p>确认删除章节</p>
|
|
|
@@ -277,7 +250,7 @@ defineExpose({
|
|
|
text-align: right;
|
|
|
}
|
|
|
|
|
|
- .repetitiveWarning{
|
|
|
+ .repetitiveWarning {
|
|
|
border: 1px solid red;
|
|
|
border-radius: 8px;
|
|
|
}
|