x1ongzhu 2 tahun lalu
induk
melakukan
ac12db7fb1
2 mengubah file dengan 67 tambahan dan 2 penghapusan
  1. 7 0
      src/api/index.ts
  2. 60 2
      src/views/page/PaperGen.vue

+ 7 - 0
src/api/index.ts

@@ -270,3 +270,10 @@ export function fetchGenChapters<T>(data: { id: number; major: string; title: st
         data
         data
     })
     })
 }
 }
+
+export function fetchSearchReference<T>(title: string) {
+    return get<T>({
+        url: `/paper/searchReferences`,
+        data: { title }
+    })
+}

+ 60 - 2
src/views/page/PaperGen.vue

@@ -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) {