|
@@ -29,6 +29,7 @@
|
|
|
<n-button type="primary" ghost @click="getData(true)"> 搜索 </n-button>
|
|
<n-button type="primary" ghost @click="getData(true)"> 搜索 </n-button>
|
|
|
</n-input-group>
|
|
</n-input-group>
|
|
|
<NButton type="primary" @click="onCreate">创建</NButton>
|
|
<NButton type="primary" @click="onCreate">创建</NButton>
|
|
|
|
|
+ <NButton type="primary" @click="showReferenceDialog = true">参考文献</NButton>
|
|
|
</NSpace>
|
|
</NSpace>
|
|
|
<n-data-table
|
|
<n-data-table
|
|
|
remote
|
|
remote
|
|
@@ -181,6 +182,24 @@
|
|
|
</NSpace>
|
|
</NSpace>
|
|
|
</n-card>
|
|
</n-card>
|
|
|
</n-modal>
|
|
</n-modal>
|
|
|
|
|
+ <n-modal v-model:show="showReferenceDialog">
|
|
|
|
|
+ <n-card style="width: 800px" title="参考文献" :bordered="false" size="huge" role="dialog" aria-modal="true">
|
|
|
|
|
+ <div class="flex" @keyup.enter="searchReference">
|
|
|
|
|
+ <NInput
|
|
|
|
|
+ class="mr-4"
|
|
|
|
|
+ v-model:value="referenceKeywords"
|
|
|
|
|
+ placeholder="请输入关键词"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ onClearClick="() => (referenceKeywords = '')"
|
|
|
|
|
+ />
|
|
|
|
|
+ <NButton type="primary" @click="searchReference" :loading="searchingReference"> 搜索 </NButton>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="p-4 overflow-auto" style="height: calc(80vh - 300px)">
|
|
|
|
|
+ <div class="mt-4" v-for="(item, i) in referenceData" :key="i">{{ item.reference[0].value[0] }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <NButton @click="copyReference" v-if="referenceData.length > 0">复制</NButton>
|
|
|
|
|
+ </n-card>
|
|
|
|
|
+ </n-modal>
|
|
|
</template>
|
|
</template>
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
import { h, defineComponent, ref, reactive, onMounted, Ref, computed } from 'vue'
|
|
import { h, defineComponent, ref, reactive, onMounted, Ref, computed } from 'vue'
|
|
@@ -219,7 +238,8 @@ import {
|
|
|
fetchPaperResults,
|
|
fetchPaperResults,
|
|
|
fetchCreatePaperOrder,
|
|
fetchCreatePaperOrder,
|
|
|
fetchUpdatePaperOrder,
|
|
fetchUpdatePaperOrder,
|
|
|
- fetchGenChapters
|
|
|
|
|
|
|
+ fetchGenChapters,
|
|
|
|
|
+ fetchSearchReference
|
|
|
} from '@/api'
|
|
} from '@/api'
|
|
|
import { format, parseISO } from 'date-fns'
|
|
import { format, parseISO } from 'date-fns'
|
|
|
import { UserAvatar } from '@/components/common'
|
|
import { UserAvatar } from '@/components/common'
|
|
@@ -235,7 +255,8 @@ import Vditor from 'vditor'
|
|
|
import 'vditor/src/assets/less/index.less'
|
|
import 'vditor/src/assets/less/index.less'
|
|
|
import OutlineEditor from '@/components/common/OutlineEditor.vue'
|
|
import OutlineEditor from '@/components/common/OutlineEditor.vue'
|
|
|
import { useRouter } from 'vue-router'
|
|
import { useRouter } from 'vue-router'
|
|
|
-
|
|
|
|
|
|
|
+import { useClipboard } from '@vueuse/core'
|
|
|
|
|
+import { copyText } from '@/utils/format'
|
|
|
const router = useRouter()
|
|
const router = useRouter()
|
|
|
const message = useMessage()
|
|
const message = useMessage()
|
|
|
const showLogin = ref(false)
|
|
const showLogin = ref(false)
|
|
@@ -834,6 +855,43 @@ async function genChapters() {
|
|
|
}
|
|
}
|
|
|
genChaptering.value = false
|
|
genChaptering.value = false
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+const showReferenceDialog = ref(false)
|
|
|
|
|
+const referenceKeywords = ref('')
|
|
|
|
|
+const referenceData: Ref<any[]> = ref([])
|
|
|
|
|
+const searchingReference = ref(false)
|
|
|
|
|
+async function searchReference() {
|
|
|
|
|
+ if (!referenceKeywords.value) {
|
|
|
|
|
+ message.error('请输入关键词')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ searchingReference.value = true
|
|
|
|
|
+ referenceData.value = []
|
|
|
|
|
+ try {
|
|
|
|
|
+ const res: any = await fetchSearchReference(referenceKeywords.value)
|
|
|
|
|
+ res.forEach((item: any, index: number) => {
|
|
|
|
|
+ item.reference.forEach((r: any) => {
|
|
|
|
|
+ for (let i = 0; i < r.value.length; i++) {
|
|
|
|
|
+ r.value[i] = r.value[i].replace(/^\[\d+\]/g, `[${index + 1}]`)
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+ referenceData.value = res
|
|
|
|
|
+ } catch (error: any) {
|
|
|
|
|
+ message.error(error.message)
|
|
|
|
|
+ }
|
|
|
|
|
+ searchingReference.value = false
|
|
|
|
|
+}
|
|
|
|
|
+async function copyReference() {
|
|
|
|
|
+ const text = referenceData.value
|
|
|
|
|
+ .map((item: any) => {
|
|
|
|
|
+ return item.reference[0].value[0]
|
|
|
|
|
+ })
|
|
|
|
|
+ .join('\n')
|
|
|
|
|
+ console.log(text)
|
|
|
|
|
+ const { copy } = useClipboard({ legacy: true })
|
|
|
|
|
+ await copy(text)
|
|
|
|
|
+}
|
|
|
</script>
|
|
</script>
|
|
|
<style lang="less" scoped>
|
|
<style lang="less" scoped>
|
|
|
:deep(.edit-form) {
|
|
:deep(.edit-form) {
|