| | |
| | | <template> |
| | | <div class="container"> |
| | | <Breadcrumb :items="['大模型', '知识库管理']" /> |
| | | <Breadcrumb :items="['dmx.list.index', 'dmx.list.kbm']" /> |
| | | <div class="main-container"> |
| | | <div class="lf-container"> |
| | | <div class="lf-container-top"> |
| | |
| | | :placeholder="$t('cardList.searchInput.placeholder')" |
| | | style="width: 130px;" |
| | | /> |
| | | <addKnow></addKnow> |
| | | <addKnow @knowledgeData="knowledgeData"></addKnow> |
| | | </div> |
| | | <div class="lf-container-down"> |
| | | <div class="tabs"> |
| | |
| | | class="tab" |
| | | v-for="(tab, index) in tabs" |
| | | :key="index" |
| | | @click="selectTab(index)" |
| | | @click="selectTab(index,tab)" |
| | | :class="{ 'active': selectedTab === index }" |
| | | > |
| | | {{ tab }} |
| | | {{ tab.name }} |
| | | <a-popover position="bl"> |
| | | <icon-more :style="{position: 'absolute',top:'10px',right:'20px'}"/> |
| | | <template #content> |
| | | <a-popconfirm content="确定删除吗?" @ok="deleteKnowledge(tab.id)" type="warning"> |
| | | <span style="cursor: pointer;color: #0960bd;font-size: 12px"><icon-delete />删除</span> |
| | | </a-popconfirm> |
| | | |
| | | </template> |
| | | </a-popover> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="rt-container"> |
| | | <a-tabs default-active-key="1"> |
| | | <a-tab-pane key="1" title="数据集"> |
| | | <a-tab-pane key="1" :title= "t('dmx.list.DataSet')"> |
| | | <div class="rt-container-main"> |
| | | <a-card ref="account" class="general-card" :title="$t('')" style="padding-top: 20px"> |
| | | <a-row> |
| | |
| | | style="width: 200px;margin-right: 10px" |
| | | /> |
| | | <!-- 新建--> |
| | | <add /> |
| | | <add :kbobj="kbobj" @changeFetchData="changeFetchData"/> |
| | | </a-col> |
| | | </a-row> |
| | | </a-form> |
| | |
| | | @page-change="onPageChange" |
| | | :scroll="{ y: 580 }" |
| | | > |
| | | <template #contentType="{ record }"> |
| | | |
| | | <template #name="{ record }"> |
| | | <!-- <icon-file style="color: #0960bd;margin-right: 4px;" />--> |
| | | <icon-file style="margin-right: 4px;" /> |
| | | <!-- <span style="color: #0960bd;cursor: pointer" @click="fileClick">--> |
| | | <!-- {{record.name}}--> |
| | | <!-- </span>--> |
| | | {{record.name}} |
| | | </template> |
| | | <template #staue="{ record }"> |
| | | <a-switch :model-value="record.staue"/> |
| | | <template #create_time="{ record }"> |
| | | <span>{{parseTime(record.create_time)}}</span> |
| | | </template> |
| | | <template #status="{ record }"> |
| | | <a-switch v-model="record.status" checked-value="0" unchecked-value="1"/> |
| | | </template> |
| | | <template #run="{ record }"> |
| | | <div style="display: flex;align-items: center;"> |
| | | <div style="width: 100px"> |
| | | <a-popover title="Title"> |
| | | <a-tag :color="'blue'" border>成功</a-tag> |
| | | <a-popover title="Title" v-if="record.run == '3'"> |
| | | <a-tag :loading="record.loading" :color="'blue'" border>{{$t('dmx.list.complete')}}</a-tag> |
| | | <template #content> |
| | | <p>Here is the text content</p> |
| | | </template> |
| | | </a-popover> |
| | | <a-popover title="Title"> |
| | | <a-tag :color="'gold'" border>取消</a-tag> |
| | | <a-popover title="Title" v-if="record.run == '2'"> |
| | | <a-tag :loading="record.loading" :color="'blue'" border>{{$t('dmx.list.complete')}}</a-tag> |
| | | <template #content> |
| | | <p>Here is the text content</p> |
| | | </template> |
| | | </a-popover> |
| | | <a-popover title="Title"> |
| | | <a-tag :color="'green'" border>未启动</a-tag> |
| | | <a-popover title="Title" v-if="record.run == '1'"> |
| | | <a-tag :loading="record.loading" :color="'gold'" border>{{$t('dmx.list.cancel')}}</a-tag> |
| | | <template #content> |
| | | <p>Here is the text content</p> |
| | | </template> |
| | | </a-popover> |
| | | <a-popover title="Title" v-if="record.run == '0'"> |
| | | <a-tag :loading="record.loading" :color="'green'" border>{{$t('dmx.list.NotStarted')}}</a-tag> |
| | | <template #content> |
| | | <p>Here is the text content</p> |
| | | </template> |
| | | </a-popover> |
| | | </div> |
| | | <div> |
| | | <a-button type="text" size="large"> |
| | | <div > |
| | | <a-button type="text" size="large" @click="run(record)" :loading="record.loading"> |
| | | <template #icon> |
| | | <icon-sync /> |
| | | </template> |
| | | </a-button> |
| | | <a-button type="text" size="large"> |
| | | <template #icon> |
| | | <icon-sync style="color: green" /> |
| | | </template> |
| | | </a-button> |
| | | <a-button type="text" size="large"> |
| | | <template #icon> |
| | | <icon-play-circle style="color: green" /> |
| | | <icon-sync v-if="record.run == '3'"/> |
| | | <icon-sync v-if="record.run == '2'"/> |
| | | <icon-sync style="color: green" v-if="record.run == '1'"/> |
| | | <icon-play-circle style="color: green" v-if="record.run == '0'"/> |
| | | </template> |
| | | </a-button> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <template #operations="{ record }" > |
| | | <template #action="{ record }" > |
| | | <tool/> |
| | | <edit/> |
| | | <a-popconfirm content="确定删除吗?" type="warning" @ok="deleteItem(record)"> |
| | | <a-button v-permission="['admin']" type="text" size="small"> |
| | | <edit :item="record" @upTabdateItem="upTabdateItem"/> |
| | | <a-popconfirm :content="t('确定删除吗')" type="warning" @ok="deleteItem(record)"> |
| | | <a-button type="text" size="small"> |
| | | <template #icon> |
| | | <icon-delete /> |
| | | </template> |
| | |
| | | </a-card> |
| | | </div> |
| | | </a-tab-pane> |
| | | <a-tab-pane key="2" title="测试"> |
| | | <a-tab-pane key="2" :title="t('dmx.list.test')"> |
| | | <div class="rt-container-main"> |
| | | <test ></test> |
| | | </div> |
| | | </a-tab-pane> |
| | | <a-tab-pane key="3" title="配置"> |
| | | <a-tab-pane key="3" :title="t('dmx.list.disposition')"> |
| | | <div class="rt-container-main"> |
| | | <config ></config> |
| | | </div> |
| | | </a-tab-pane> |
| | | </a-tabs> |
| | | <div v-if="detailsShow" class="details"> |
| | | <div class="details-header"> |
| | | <div style="display: flex;align-items: center"> |
| | | <span><icon-arrow-left size="20px" style="cursor: pointer;color: #0960bd;margin: 10px" @click="goBackClick" /></span> |
| | | <icon-file style="color: #0960bd;margin-right: 4px;" /> |
| | | <span style="">123.docx</span> |
| | | </div> |
| | | <div style="display: flex; align-items: center;"> |
| | | <a-radio-group v-model="position" type="button" style="margin-right: 10px"> |
| | | <a-radio value="top">{{'dmx.list.EntireArticle'}}</a-radio> |
| | | <a-radio value="right">{{'dmx.list.omit'}}</a-radio> |
| | | </a-radio-group> |
| | | <a-popover position="bottom"> |
| | | <a-button type="outline" class="button" style="margin-right: 10px">{{'dmx.list.batch'}} <icon-down style="margin-left: 4px" /></a-button> |
| | | <template #content> |
| | | <p>Here is the text content</p> |
| | | <p>Here is the text content</p> |
| | | </template> |
| | | </a-popover> |
| | | <a-button type="outline" class="button" style="margin-right: 10px"> |
| | | <template #icon> |
| | | <icon-search /> |
| | | </template> |
| | | </a-button> |
| | | <a-popover position="bottom"> |
| | | <a-button type="outline" class="button" style="margin-right: 10px"><icon-sort /></a-button> |
| | | <template #content> |
| | | <p>Here is the text content</p> |
| | | <p>Here is the text content</p> |
| | | </template> |
| | | </a-popover> |
| | | <addDetails></addDetails> |
| | | </div> |
| | | </div> |
| | | <a-divider style="margin-top: 10px" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts" setup> |
| | | import { computed, ref, reactive, watch, nextTick } from 'vue'; |
| | | import { computed, ref, reactive, watch, nextTick, onBeforeMount } from "vue"; |
| | | import { useI18n } from 'vue-i18n'; |
| | | import useLoading from '@/hooks/loading'; |
| | | import { queryPolicyList, PolicyRecord, PolicyParams } from '@/api/list'; |
| | | import { |
| | | queryKbList, |
| | | PolicyRecord, |
| | | PolicyParams, |
| | | queryKbDocumentList, |
| | | deleteKnow, |
| | | queryKbdetail, |
| | | queryKbtenantInfo, kbdocumentrm, kbdocumentchangeparser, kbdocumentrun |
| | | } from "@/api/kbList"; |
| | | import { Pagination } from '@/types/global'; |
| | | import type { SelectOptionData } from '@arco-design/web-vue/es/select/interface'; |
| | | import type { TableColumnData } from '@arco-design/web-vue/es/table/interface'; |
| | |
| | | import config from '@/views/dmx/knowledgeLib/config.vue' |
| | | import test from '@/views/dmx/knowledgeLib/test.vue' |
| | | import tool from '@/views/dmx/knowledgeLib/tool.vue' |
| | | import addDetails from '@/views/dmx/knowledgeLib/addDetails.vue' |
| | | import { deleteAccount } from "@/api/account"; |
| | | import { Message } from "@arco-design/web-vue"; |
| | | import { parseTime } from "@/utils"; |
| | | type SizeProps = 'mini' | 'small' | 'medium' | 'large'; |
| | | type Column = TableColumnData & { checked?: true }; |
| | | const account = ref(null) |
| | |
| | | }; |
| | | const { loading, setLoading } = useLoading(true); |
| | | const { t } = useI18n(); |
| | | const renderData = ref<PolicyRecord[]>([]); |
| | | const renderData = ref([]); |
| | | const formModel = ref(generateFormModel()); |
| | | const cloneColumns = ref<Column[]>([]); |
| | | const cloneColumns = ref([]); |
| | | const showColumns = ref<Column[]>([]); |
| | | |
| | | const size = ref<SizeProps>('medium'); |
| | | let visible = ref(false) |
| | | let detailsShow = ref(false) |
| | | let selectedTab = ref(0) |
| | | let tabs = reactive(['法律知识库', '政务知识库', '医学知识库', '其他知识库']) |
| | | let kbobj = reactive({}) |
| | | let tabs = ref([]) |
| | | |
| | | const selectTab = (index) => { |
| | | const selectTab = (index,item) => { |
| | | selectedTab.value= index; |
| | | console.log(item.id); |
| | | kbobj= item |
| | | fetchData({ |
| | | kb_id: kbobj.id, |
| | | page: 1, |
| | | page_size: 20 |
| | | }) |
| | | } |
| | | |
| | | const basePagination: Pagination = { |
| | |
| | | ]); |
| | | const columns = computed<TableColumnData[]>(() => [ |
| | | { |
| | | title: t('名称'), |
| | | title: t('dmx.column.name'), |
| | | dataIndex: 'name', |
| | | slotName: 'name', |
| | | }, |
| | | { |
| | | title: t('分快数'), |
| | | dataIndex: 'contentType', |
| | | slotName: 'contentType', |
| | | dataIndex: 'chunk_num', |
| | | }, |
| | | { |
| | | title: t('上传时间'), |
| | | dataIndex: 'filterType', |
| | | title: t('dmx.column.UploadTime'), |
| | | dataIndex: 'create_time', |
| | | slotName: 'create_time', |
| | | width:200 |
| | | }, |
| | | { |
| | | title: t('创建人'), |
| | | dataIndex: 'count', |
| | | }, |
| | | { |
| | | title: t('解析状态'), |
| | | dataIndex: 'createdTime', |
| | | title: t('解析方法'), |
| | | dataIndex: 'parser_id', |
| | | slotName: 'parser_id', |
| | | }, |
| | | { |
| | | title: t('启用'), |
| | | dataIndex: 'staue', |
| | | slotName: 'staue', |
| | | }, |
| | | { |
| | | title: t('解析状态'), |
| | | dataIndex: 'status', |
| | | slotName: 'status', |
| | | slotName: 'status', |
| | | }, |
| | | { |
| | | title: t('操作'), |
| | | dataIndex: 'operations', |
| | | slotName: 'operations', |
| | | title: t('解析状态'), |
| | | dataIndex: 'run', |
| | | slotName: 'run', |
| | | }, |
| | | { |
| | | title: t('dmx.column.Operate'), |
| | | dataIndex: 'action', |
| | | slotName: 'action', |
| | | width: 150, |
| | | minWidth: 100, |
| | | minWidth: 150, |
| | | }, |
| | | ]); |
| | | const contentTypeOptions = computed<SelectOptionData[]>(() => [ |
| | |
| | | value: 'offline', |
| | | }, |
| | | ]); |
| | | const fetchData = async ( |
| | | params: PolicyParams = { current: 1, pageSize: 20 } |
| | | ) => { |
| | | const fetchData = async (params) => { |
| | | setLoading(true); |
| | | try { |
| | | const { data } = await queryPolicyList(params); |
| | | renderData.value = data.list; |
| | | console.log(renderData, 'renderData'); |
| | | pagination.current = params.current; |
| | | pagination.total = data.total; |
| | | const data = await queryKbDocumentList(params); |
| | | console.log(data, 'data'); |
| | | if(data.code=='0'){ |
| | | renderData.value = data.data.docs||[]; |
| | | renderData.value = renderData.value.map((item) => { |
| | | return { |
| | | ...item, |
| | | loading: false, |
| | | }; |
| | | }); |
| | | console.log(renderData.value, 'renderData.value'); |
| | | |
| | | pagination.current = params.page; |
| | | pagination.total = data.data.total; |
| | | // 查询知识库详情 |
| | | const kbdetail = await queryKbdetail({ |
| | | kb_id:params.kb_id, |
| | | }); |
| | | // 详情 |
| | | // const kbtenantInfo = await queryKbtenantInfo(); |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | } catch (err) { |
| | | // you can report use errorHandler or other |
| | | } finally { |
| | |
| | | }; |
| | | |
| | | const search = () => { |
| | | fetchData({ |
| | | ...basePagination, |
| | | ...formModel.value, |
| | | } as unknown as PolicyParams); |
| | | alert(1) |
| | | // fetchData({ |
| | | // ...basePagination, |
| | | // ...formModel.value, |
| | | // }); |
| | | }; |
| | | |
| | | const handleClick = ()=>{ |
| | |
| | | fetchData({ ...basePagination, current }); |
| | | }; |
| | | |
| | | fetchData(); |
| | | const knowledgeData = async ( |
| | | params = { page: 1, page_size: 20 } |
| | | ) => { |
| | | setLoading(true); |
| | | try { |
| | | const { data } = await queryKbList(params); |
| | | console.log(data, 'data'); |
| | | tabs.value = data; |
| | | console.log(tabs.value, 'tabs'); |
| | | if(tabs.value.length>0 && tabs.value[0]){ |
| | | kbobj = tabs.value[0] |
| | | fetchData({ |
| | | kb_id: kbobj.id, |
| | | page: 1, |
| | | page_size: 20 |
| | | }) |
| | | } |
| | | // renderData.value = data.list; |
| | | // console.log(renderData, 'renderData'); |
| | | // pagination.current = params.current; |
| | | // pagination.total = data.total; |
| | | } catch (err) { |
| | | // you can report use errorHandler or other |
| | | } finally { |
| | | setLoading(false); |
| | | } |
| | | }; |
| | | |
| | | const deleteKnowledge = async (id) => { |
| | | let data = await deleteKnow({ |
| | | kb_id:id |
| | | }) |
| | | if(data.code == 0){ |
| | | Message.success('删除成功'); |
| | | knowledgeData() |
| | | } |
| | | } |
| | | const reset = () => { |
| | | formModel.value = generateFormModel(); |
| | | }; |
| | |
| | | } |
| | | }; |
| | | |
| | | const deleteItem = async (row)=>{ |
| | | console.log(row); |
| | | // let data = await deleteAccount({id: row.number}) |
| | | account.value.$messageSuccess('删除成功') |
| | | // |
| | | // if(data.code == 200){ |
| | | // this.$messageSuccess('删除成功') |
| | | // } |
| | | const fileClick = ()=>{ |
| | | detailsShow.value = true |
| | | |
| | | } |
| | | |
| | | const goBackClick = ()=>{ |
| | | detailsShow.value = false |
| | | |
| | | } |
| | | function upTabdateItem(id, newName) { |
| | | console.log(id, newName); |
| | | const itemToUpdate = renderData.value.find(item => item.id === id); |
| | | if (itemToUpdate) { |
| | | itemToUpdate.name = newName; |
| | | } |
| | | } |
| | | |
| | | const deleteItem = async (row)=>{ |
| | | console.log(row); |
| | | let data = await kbdocumentrm({doc_id: row.id}) |
| | | if(data.code == 0){ |
| | | Message.success('删除成功'); |
| | | console.log(kbobj, 'kbobj'); |
| | | fetchData({ |
| | | kb_id: kbobj.id, |
| | | page: 1, |
| | | page_size: 20 |
| | | }) |
| | | } |
| | | } |
| | | |
| | | const run = async (row)=>{ |
| | | console.log(row); |
| | | row.loading = true; |
| | | let data = await kbdocumentrun({ |
| | | doc_ids: [row.id], |
| | | run: '1' |
| | | }) |
| | | // let data = await kbdocumentchangeparser({ |
| | | // parser_id: row.parser_id, |
| | | // doc_id: row.id, |
| | | // parser_config: row.parser_config, |
| | | // }) |
| | | if(data.code == 0){ |
| | | Message.success('解析成功'); |
| | | row.run = '3'; |
| | | }else{ |
| | | Message.error('解析失败'); |
| | | row.run = '1'; |
| | | } |
| | | row.loading = false; |
| | | } |
| | | |
| | | const changeFetchData = async (row)=>{ |
| | | fetchData({ |
| | | kb_id: kbobj.id, |
| | | page: 1, |
| | | page_size: 20 |
| | | }) |
| | | } |
| | | watch( |
| | | () => columns.value, |
| | | (val) => { |
| | |
| | | }, |
| | | { deep: true, immediate: true } |
| | | ); |
| | | |
| | | onBeforeMount(()=>{ |
| | | knowledgeData() |
| | | }) |
| | | |
| | | </script> |
| | | |
| | | <script lang="ts"> |
| | |
| | | } |
| | | } |
| | | .rt-container{ |
| | | position: relative; |
| | | //background: #626aea; |
| | | margin-left: 20px; |
| | | width: calc(100% - 200px); |
| | |
| | | .rt-container-main{ |
| | | height: 76vh; |
| | | } |
| | | .details{ |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | background: #ffffff; |
| | | .details-header{ |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-top: 10px; |
| | | padding-right: 20px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |