| | |
| | | <div class="lf-container-top"> |
| | | <a-input-search |
| | | :placeholder="$t('cardList.searchInput.placeholder')" |
| | | style="width: 130px;" |
| | | style="width: 130px" |
| | | /> |
| | | <addKnow @knowledgeData="knowledgeData"></addKnow> |
| | | <addKnow |
| | | @getknowledge="getknowledge" |
| | | @getKbdetail="getKbdetail" |
| | | ></addKnow> |
| | | </div> |
| | | <div class="lf-container-down"> |
| | | <a-scrollbar style="height:56rem;overflow: auto;"> |
| | | <a-spin :loading="listloading" class="lf-container-down"> |
| | | <a-scrollbar style="height: calc(100vh - 300px); overflow: auto"> |
| | | <div |
| | | class="tab" |
| | | v-for="(tab, index) in tabs" |
| | | :key="index" |
| | | @click="selectTab(index,tab)" |
| | | :class="{ 'active': selectedTab === index }" |
| | | @click="selectTab(index, tab)" |
| | | :class="{ active: selectedTab === index }" |
| | | > |
| | | {{ tab.name }} |
| | | <a-popover position="bl"> |
| | | <icon-more :style="{position: 'absolute',top:'10px',right:'20px'}"/> |
| | | <icon-more |
| | | :style="{ position: 'absolute', top: '10px', right: '10px' }" |
| | | /> |
| | | <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> |
| | | <!-- <a-popconfirm content="确定删除吗?" @ok="deleteKnowledge(tab.id)" type="warning">--> |
| | | <!-- <span style="cursor: pointer;color: #4977ba;font-size: 12px"><icon-delete style="font-size: 14px"/>删除</span>--> |
| | | <!-- </a-popconfirm>--> |
| | | <span |
| | | style="cursor: pointer; color: #4977ba; font-size: 12px" |
| | | @click="deleteKnowledge(tab.id)" |
| | | ><icon-delete style="font-size: 14px" />删除</span |
| | | > |
| | | </template> |
| | | </a-popover> |
| | | </div> |
| | | </a-scrollbar> |
| | | </div> |
| | | </a-spin> |
| | | </div> |
| | | <div class="rt-container"> |
| | | <a-tabs default-active-key="1"> |
| | | <a-tab-pane key="1" :title= "t('dmx.list.DataSet')"> |
| | | <div class="rt-container-main"> |
| | | <a-card ref="account" class="general-card" title="" style="padding-top: 20px"> |
| | | <div class="rt-container" v-if="tabs.length > 0"> |
| | | <a-tabs :active-key="activeKey" @change="handleTabChange"> |
| | | <a-tab-pane key="1" :title="t('dmx.list.DataSet')"> |
| | | <a-scrollbar |
| | | class="rt-container-main" |
| | | :style="{ height: documentHeight + 70 + 'px' }" |
| | | style="overflow: auto" |
| | | > |
| | | <a-card |
| | | ref="account" |
| | | class="general-card" |
| | | title="" |
| | | style="padding-top: 20px" |
| | | > |
| | | <a-row> |
| | | <a-col :flex="1" :span="12"> |
| | | <a-form |
| | |
| | | label-align="left" |
| | | > |
| | | <a-row :gutter="16"> |
| | | <a-col :span="24" style="margin-bottom: 10px;display: flex;justify-content: right"> |
| | | <a-input-search |
| | | :placeholder="$t('cardList.searchInput.placeholder')" |
| | | style="width: 200px;margin-right: 10px" |
| | | v-model="keywords" |
| | | @change="search" |
| | | /> |
| | | <!--新建--> |
| | | <add :kbobj="kbobj" @changeFetchData="changeFetchData"/> |
| | | <a-col |
| | | :span="24" |
| | | style=" |
| | | margin-bottom: 10px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | " |
| | | > |
| | | <a-popover |
| | | position="bottom" |
| | | v-model="checkedArr.length" |
| | | trigger="click" |
| | | > |
| | | <a-button :disabled="checkedArr.length == 0" border |
| | | >批量 |
| | | <icon-down style="margin-left: 4px" /> |
| | | </a-button> |
| | | <template #content> |
| | | <p> |
| | | <a-button |
| | | type="text" |
| | | class="button" |
| | | style="color: #2a2a2b" |
| | | @click="enableDisable(1)" |
| | | > |
| | | <template #icon> |
| | | <icon-play-circle /> |
| | | </template> |
| | | 启用 |
| | | </a-button> |
| | | </p> |
| | | <p> |
| | | <a-button |
| | | type="text" |
| | | class="button" |
| | | style="color: #2a2a2b" |
| | | @click="enableDisable(0)" |
| | | > |
| | | <template #icon> |
| | | <icon-record color="" /> |
| | | </template> |
| | | 禁用 |
| | | </a-button> |
| | | </p> |
| | | <p> |
| | | <a-button |
| | | type="text" |
| | | class="button" |
| | | style="color: #2a2a2b" |
| | | @click="addBlock(1)" |
| | | > |
| | | <template #icon> |
| | | <icon-check-circle /> |
| | | </template> |
| | | 启动 |
| | | </a-button> |
| | | </p> |
| | | <p> |
| | | <a-button |
| | | type="text" |
| | | class="button" |
| | | style="color: #2a2a2b" |
| | | @click="addBlock(2)" |
| | | > |
| | | <template #icon> |
| | | <icon-close-circle /> |
| | | </template> |
| | | 取消 |
| | | </a-button> |
| | | </p> |
| | | <a-divider style="margin: 10px 0" /> |
| | | <p> |
| | | <a-button |
| | | type="text" |
| | | class="button" |
| | | style="color: #2a2a2b" |
| | | @click="addBlock(3)" |
| | | > |
| | | <template #icon> |
| | | <icon-delete /> |
| | | </template> |
| | | 删除 |
| | | </a-button> |
| | | </p> |
| | | </template> |
| | | </a-popover> |
| | | <span> |
| | | <a-input-search |
| | | :placeholder=" |
| | | $t('cardList.searchInput.placeholder') |
| | | " |
| | | style="width: 200px; margin-right: 10px" |
| | | v-model="keywords" |
| | | @change="search" |
| | | /> |
| | | <!--新建--> |
| | | <add |
| | | :kbobj="kbobj" |
| | | @changeFetchData="changeFetchData" |
| | | /> |
| | | </span> |
| | | </a-col> |
| | | </a-row> |
| | | </a-form> |
| | |
| | | </a-col> |
| | | <a-col |
| | | :span="12" |
| | | style="display: flex; align-items: center; justify-content: end" |
| | | style=" |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: end; |
| | | " |
| | | > |
| | | <!-- <a-button>--> |
| | | <!-- <template #icon>--> |
| | |
| | | <!-- {{ $t('searchTable.operation.download') }}--> |
| | | <!-- </a-button>--> |
| | | <a-tooltip :content="$t('searchTable.actions.refresh')"> |
| | | <div class="action-icon" |
| | | ><icon-refresh size="18" |
| | | /></div> |
| | | <div class="action-icon"> |
| | | <icon-refresh size="18" /> |
| | | </div> |
| | | </a-tooltip> |
| | | <a-dropdown @select="handleSelectDensity"> |
| | | <a-tooltip :content="$t('searchTable.actions.density')"> |
| | | <div class="action-icon"><icon-line-height size="18" /></div> |
| | | <div class="action-icon"> |
| | | <icon-line-height size="18" /> |
| | | </div> |
| | | </a-tooltip> |
| | | <template #content> |
| | | <a-doption |
| | |
| | | :bordered="false" |
| | | :size="size" |
| | | @page-change="onPageChange" |
| | | :scroll="{ y: 580 }" |
| | | :max-height="documentHeight" |
| | | :scroll="{ x: 1000 }" |
| | | :row-selection="{ |
| | | type: 'checkbox', |
| | | showCheckedAll: true, |
| | | onlyCurrent: false, |
| | | }" |
| | | @select-all="selectTabAll" |
| | | @selection-change="selectTabChange" |
| | | > |
| | | <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}} |
| | | <!-- <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 #create_time="{ record }"> |
| | | <span>{{parseTime(record.create_time)}}</span> |
| | | <span>{{ parseTime(record.create_time) }}</span> |
| | | </template> |
| | | <!-- <template #parser_id="{ record }">--> |
| | | <!-- <span>{{ parser_ids[record.parser_id]}}</span>--> |
| | | <!-- </template>--> |
| | | <!-- <template #parser_id="{ record }">--> |
| | | <!-- <span>{{ parser_ids[record.parser_id]}}</span>--> |
| | | <!-- </template>--> |
| | | <template #status="{ record }"> |
| | | <a-switch v-model="record.status" size="small" checked-value="1" unchecked-value="0" @change="handleChangeStatus(record)"/> |
| | | <a-switch |
| | | v-model="record.status" |
| | | size="small" |
| | | checked-value="1" |
| | | unchecked-value="0" |
| | | @change="handleChangeStatus(record)" |
| | | /> |
| | | </template> |
| | | <template #run="{ record }"> |
| | | <div style="display: flex;align-items: center;"> |
| | | <div style="display: flex; align-items: center"> |
| | | <div style="width: 100px"> |
| | | <a-popover title="Title" v-if="record.run == '3'"> |
| | | <a-tag :loading="record.loading" :color="'blue'" border>{{$t('dmx.list.complete')}}</a-tag> |
| | | <a-popover title="" v-if="record.run == '4'"> |
| | | <a-tag |
| | | :loading="record.loading" |
| | | :color="'blue'" |
| | | border |
| | | >{{ $t('dmx.list.complete') }}</a-tag |
| | | > |
| | | <template #content> |
| | | <p>Here is the text content</p> |
| | | <p>流程开始于:{{ record.process_begin_at }}</p> |
| | | <p |
| | | >过程持续时间:{{ |
| | | record.process_duation.toFixed(2) |
| | | }}</p |
| | | > |
| | | <div> |
| | | <p |
| | | >进度消息:<span |
| | | v-html=" |
| | | record.progress_msg.replace(/\n/g, '<br/>') |
| | | " |
| | | ></span |
| | | ></p> |
| | | </div> |
| | | </template> |
| | | </a-popover> |
| | | <a-popover title="Title" v-if="record.run == '1'"> |
| | | <a-tag :loading="record.loading" :color="'blue'" border>{{$t('dmx.list.complete')}}</a-tag> |
| | | <a-popover 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> |
| | | <p>流程开始于:{{ record.process_begin_at }}</p> |
| | | <p |
| | | >过程持续时间:{{ |
| | | record.process_duation.toFixed(2) |
| | | }}</p |
| | | > |
| | | <div> |
| | | <p |
| | | >进度消息:<span |
| | | v-html=" |
| | | record.progress_msg.replace(/\n/g, '<br/>') |
| | | " |
| | | ></span |
| | | ></p> |
| | | </div> |
| | | </template> |
| | | </a-popover> |
| | | <a-popover title="Title" v-if="record.run == '2'"> |
| | | <a-tag :loading="record.loading" :color="'gold'" border>{{$t('dmx.list.cancel')}}</a-tag> |
| | | <a-popover title="" v-if="record.run == '1'"> |
| | | <a-tag |
| | | :loading="record.loading" |
| | | :color="'blue'" |
| | | border |
| | | >解析中...</a-tag |
| | | > |
| | | <template #content> |
| | | <p>Here is the text content</p> |
| | | <p>流程开始于:{{ record.process_begin_at }}</p> |
| | | <p |
| | | >过程持续时间:{{ |
| | | record.process_duation.toFixed(2) |
| | | }}</p |
| | | > |
| | | <div> |
| | | <p |
| | | >进度消息:<span |
| | | v-html=" |
| | | record.progress_msg.replace(/\n/g, '<br/>') |
| | | " |
| | | ></span |
| | | ></p> |
| | | </div> |
| | | </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> |
| | | <a-popover title="" v-if="record.run == '2'"> |
| | | <a-tag |
| | | :loading="record.loading" |
| | | :color="'gold'" |
| | | border |
| | | >{{ $t('dmx.list.cancel') }}</a-tag |
| | | > |
| | | <template #content> |
| | | <p>Here is the text content</p> |
| | | <p>流程开始于:{{ record.process_begin_at }}</p> |
| | | <p |
| | | >过程持续时间:{{ |
| | | record.process_duation.toFixed(2) |
| | | }}</p |
| | | > |
| | | <div> |
| | | <p |
| | | >进度消息:<span |
| | | v-html=" |
| | | record.progress_msg.replace(/\n/g, '<br/>') |
| | | " |
| | | ></span |
| | | ></p> |
| | | </div> |
| | | </template> |
| | | </a-popover> |
| | | <a-popover title="" v-if="record.run == '0'"> |
| | | <a-tag |
| | | :loading="record.loading" |
| | | :color="'green'" |
| | | border |
| | | >{{ $t('dmx.list.NotStarted') }} |
| | | </a-tag> |
| | | <template #content> |
| | | <p>流程开始于:{{ record.process_begin_at }}</p> |
| | | <p |
| | | >过程持续时间:{{ |
| | | record.process_duation.toFixed(2) |
| | | }}</p |
| | | > |
| | | <div> |
| | | <p |
| | | >进度消息:<span |
| | | v-html=" |
| | | record.progress_msg.replace(/\n/g, '<br/>') |
| | | " |
| | | ></span |
| | | ></p> |
| | | </div> |
| | | </template> |
| | | </a-popover> |
| | | </div> |
| | | <div > |
| | | <a-button type="text" size="large" @click="run(record)" :loading="record.loading"> |
| | | <div> |
| | | <a-button |
| | | type="text" |
| | | size="large" |
| | | @click="run(record)" |
| | | :loading="record.loading" |
| | | > |
| | | <template #icon> |
| | | <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'"/> |
| | | <icon-sync v-if="record.run == '4'" /> |
| | | <icon-sync v-if="record.run == '3'" /> |
| | | <icon-sync |
| | | style="color: green" |
| | | v-if="record.run == '2'" |
| | | /> |
| | | <a-button |
| | | status="warning" |
| | | shape="circle" |
| | | v-if="record.run == '1'" |
| | | size="small" |
| | | > |
| | | <icon-close /> |
| | | </a-button> |
| | | <icon-play-circle |
| | | style="color: green" |
| | | v-if="record.run == '0'" |
| | | /> |
| | | </template> |
| | | </a-button> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <template #action="{ record }" > |
| | | <tool :kbtenantInfo="kbtenantInfo" :item="record" :kbdetail="kbdetail" /> |
| | | <edit :item="record" @upTabdateItem="upTabdateItem"/> |
| | | <a-popconfirm :content="'确定删除吗'" type="warning" @ok="deleteItem(record)"> |
| | | <a-button type="text" size="small"> |
| | | <template #action="{ record }"> |
| | | <tool |
| | | :kbtenantInfo="kbtenantInfo" |
| | | :item="record" |
| | | :kbdetail="kbdetail" |
| | | /> |
| | | <edit :item="record" @upTabdateItem="upTabdateItem" /> |
| | | <a-popconfirm |
| | | :content="'确定删除吗'" |
| | | type="warning" |
| | | @ok="deleteItem(record)" |
| | | > |
| | | <a-button |
| | | type="text" |
| | | size="small" |
| | | :disabled="record.run == '1'" |
| | | > |
| | | <template #icon> |
| | | <icon-delete /> |
| | | </template> |
| | | </a-button> |
| | | </a-popconfirm> |
| | | <a-button type="text" size="small" @click="onDownloadDocument(record)"> |
| | | <a-button |
| | | type="text" |
| | | size="small" |
| | | :disabled="record.run == '1'" |
| | | @click="onDownloadDocument(record)" |
| | | > |
| | | <template #icon> |
| | | <icon-download /> |
| | | </template> |
| | | </a-button> |
| | | |
| | | <a-button type="text" size="small" @click="seeload(record)"> |
| | | <!-- <a-button |
| | | type="text" |
| | | size="small" |
| | | :disabled="record.run == '1'" |
| | | @click="previewArea(record)" |
| | | > |
| | | <template #icon> |
| | | <icon-eye /> |
| | | </template> |
| | | </a-button> |
| | | |
| | | </a-button> --> |
| | | </template> |
| | | </a-table> |
| | | </a-card> |
| | | </div> |
| | | </a-scrollbar> |
| | | </a-tab-pane> |
| | | <a-tab-pane key="2" :title="t('dmx.list.test')"> |
| | | <div class="rt-container-main"> |
| | | <a-scrollbar |
| | | class="rt-container-main" |
| | | :style="{ height: documentHeight + 70 + 'px' }" |
| | | style="overflow: auto" |
| | | > |
| | | <test ref="testForm"></test> |
| | | </div> |
| | | </a-scrollbar> |
| | | </a-tab-pane> |
| | | <a-tab-pane key="3" :title="t('dmx.list.disposition')"> |
| | | <div class="rt-container-main"> |
| | | <config ref="configForm" :kbtenantInfo="kbtenantInfo" :kbobj="kbobj"></config> |
| | | </div> |
| | | <a-scrollbar |
| | | class="rt-container-main" |
| | | :style="{ height: documentHeight + 70 + 'px' }" |
| | | style="overflow: auto" |
| | | > |
| | | <config |
| | | ref="configForm" |
| | | :kbtenantInfo="kbtenantInfo" |
| | | @cancleConfig="cancleConfig" |
| | | @saveConfig="saveConfig" |
| | | ></config> |
| | | </a-scrollbar> |
| | | </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 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> |
| | | <a-modal title=" " v-model:visible="visible" :footer="false" fullscreen> |
| | | <!-- <docx v-if="documenttype=='docx'" previewSrc="http://192.168.20.116:1080/v1/document/get/405c3efa4d8c11ef97560242ac120006"></docx>--> |
| | | <docx v-if="documenttype=='docx'" :previewSrc="previewSrc"></docx> |
| | | <excel v-if="documenttype=='excel'" :previewSrc="previewSrc"></excel> |
| | | <txtPdf v-if="documenttype=='txtPdf'" :previewSrc="previewSrc"></txtPdf> |
| | | <!-- <docx previewSrc="http://192.168.20.116:1080/v1/document/get/405c3efa4d8c11ef97560242ac120006"></docx>--> |
| | | <docx v-if="documenttype == 'docx'" :previewSrc="previewSrc"></docx> |
| | | <excel v-if="documenttype == 'excel'" :previewSrc="previewSrc"></excel> |
| | | <txtPdf v-if="documenttype == 'txtPdf'" :previewSrc="previewSrc"></txtPdf> |
| | | </a-modal> |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts" setup> |
| | | import { computed, ref, reactive, watch, nextTick, onBeforeMount, onMounted } from "vue"; |
| | | import { |
| | | computed, |
| | | ref, |
| | | reactive, |
| | | watch, |
| | | nextTick, |
| | | onBeforeMount, |
| | | onMounted, |
| | | } from 'vue'; |
| | | import { useI18n } from 'vue-i18n'; |
| | | import useLoading from '@/hooks/loading'; |
| | | import { |
| | | queryKbList, |
| | | PolicyRecord, |
| | | PolicyParams, |
| | | queryKbDocumentList, |
| | | deleteKnow, |
| | | queryKbdetail, |
| | | queryKbtenantInfo, kbdocumentrm, kbdocumentchangeparser, kbdocumentrun, kbdocumentchangeStatus,downloadFile |
| | | } from "@/api/kbList"; |
| | | import { |
| | | queryKbList, |
| | | PolicyRecord, |
| | | PolicyParams, |
| | | queryKbDocumentList, |
| | | deleteKnow, |
| | | queryKbdetail, |
| | | queryKbtenantInfo, |
| | | kbdocumentrm, |
| | | kbdocumentchangeparser, |
| | | kbdocumentrun, |
| | | kbdocumentchangeStatus, |
| | | downloadFile, |
| | | chunkSwitch, |
| | | changeStatus, |
| | | } 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 cloneDeep from 'lodash/cloneDeep'; |
| | | import Sortable from 'sortablejs'; |
| | | import add from '@/views/dmx/knowledgeLib/add.vue' |
| | | import edit from '@/views/dmx/knowledgeLib/edit.vue' |
| | | import addKnow from '@/views/dmx/knowledgeLib/addKnow.vue' |
| | | 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 docx from '@/views/dmx/knowledgeLib/components/docx.vue' |
| | | import excel from '@/views/dmx/knowledgeLib/components/excel.vue' |
| | | import txtPdf from '@/views/dmx/knowledgeLib/components/txtPdf.vue' |
| | | import { Message } from "@arco-design/web-vue"; |
| | | import { parseTime } from "@/utils"; |
| | | import add from '@/views/dmx/knowledgeLib/add.vue'; |
| | | import edit from '@/views/dmx/knowledgeLib/edit.vue'; |
| | | import addKnow from '@/views/dmx/knowledgeLib/addKnow.vue'; |
| | | 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 docx from '@/views/dmx/knowledgeLib/components/docx.vue'; |
| | | import excel from '@/views/dmx/knowledgeLib/components/excel.vue'; |
| | | import txtPdf from '@/views/dmx/knowledgeLib/components/txtPdf.vue'; |
| | | import { Message, Modal } from '@arco-design/web-vue'; |
| | | import { documentHeight, parseTime } from '@/utils'; |
| | | import { deleteLlm } from '@/api/model'; |
| | | import { userModelState } from '@/store'; |
| | | |
| | | let modelStore = userModelState(); |
| | | const httpUrl = modelStore.hrefUrl; |
| | | type SizeProps = 'mini' | 'small' | 'medium' | 'large'; |
| | | type Column = TableColumnData & { checked?: true }; |
| | | const account = ref(null) |
| | | const account = ref(null); |
| | | const generateFormModel = () => { |
| | | return { |
| | | number: '', |
| | |
| | | const showColumns = ref<Column[]>([]); |
| | | |
| | | const size = ref<SizeProps>('medium'); |
| | | let visible = ref(false) |
| | | let keywords = ref('') |
| | | let detailsShow = ref(false) |
| | | let selectedTab = ref(0) |
| | | let testForm = ref(null) |
| | | let configForm = ref(null) |
| | | let documenttype = ref('docx') |
| | | let previewSrc = ref('') |
| | | let kbId = ref('') |
| | | let kbobj = reactive({}) |
| | | let kbdetail = reactive({}) |
| | | let parser_ids = reactive({}) |
| | | let seeObj = reactive({}) |
| | | let visible = ref(false); |
| | | let listloading = ref(false); |
| | | let keywords = ref(''); |
| | | let activeKey = ref('1'); |
| | | let detailsShow = ref(false); |
| | | let checkedAll = ref(false); |
| | | let checkedArr = ref([]); |
| | | let selectedTab = ref(0); |
| | | let testForm = ref(null); |
| | | let configForm = ref(null); |
| | | let documenttype = ref('docx'); |
| | | let previewSrc = ref(''); |
| | | let kbId = ref(''); |
| | | let kbobj = reactive({}); |
| | | let kbdetail = reactive({}); |
| | | let parser_ids = reactive({}); |
| | | let seeObj = reactive({}); |
| | | let kbtenantInfo = reactive({ |
| | | "asr_id": "paraformer-realtime-8k-v1", |
| | | "embd_id": "BAAI/bge-large-zh-v1.5", |
| | | "img2txt_id": "qwen-vl-max", |
| | | "llm_id": "qwen-plus", |
| | | "name": "wanghao‘s Kingdom", |
| | | "parser_ids": "naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One", |
| | | "rerank_id": "BAAI/bge-reranker-v2-m3", |
| | | "role": "owner", |
| | | "tenant_id": "948fc6fa41ab11ef8fb80242ac120004", |
| | | parser_idObj:{} |
| | | }) |
| | | let tabs = ref([]) |
| | | asr_id: 'paraformer-realtime-8k-v1', |
| | | embd_id: 'BAAI/bge-large-zh-v1.5', |
| | | img2txt_id: 'qwen-vl-max', |
| | | llm_id: 'qwen-plus', |
| | | name: 'wanghaos Kingdom', |
| | | parser_ids: |
| | | 'naive:General,qa:Q&A,resume:Resume,manual:Manual,table:Table,paper:Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One', |
| | | rerank_id: 'BAAI/bge-reranker-v2-m3', |
| | | role: 'owner', |
| | | tenant_id: '948fc6fa41ab11ef8fb80242ac120004', |
| | | parser_idObj: {}, |
| | | }); |
| | | let tabs = ref([]); |
| | | |
| | | const selectTab = (index,item) => { |
| | | selectedTab.value= index; |
| | | const selectTab = (index, item) => { |
| | | selectedTab.value = index; |
| | | checkedArr.value = []; |
| | | // console.log(item.id); |
| | | kbobj= item; |
| | | kbobj = item; |
| | | kbId = kbobj.id; |
| | | testForm.value.changekbid(kbId); |
| | | configForm.value.changekbObj(kbobj); |
| | | fetchData({ |
| | | kb_id: kbobj.id, |
| | | page: 1, |
| | | page_size: 20 |
| | | }) |
| | | } |
| | | page_size: 10, |
| | | }); |
| | | getKbdetail(kbobj.id); |
| | | }; |
| | | |
| | | const basePagination: Pagination = { |
| | | current: 1, |
| | | pageSize: 20, |
| | | page: 1, |
| | | page_size: 10, |
| | | }; |
| | | const pagination = reactive({ |
| | | ...basePagination, |
| | |
| | | title: t('dmx.column.UploadTime'), |
| | | dataIndex: 'create_time', |
| | | slotName: 'create_time', |
| | | width:200 |
| | | width: 200, |
| | | }, |
| | | { |
| | | title: t('解析方法'), |
| | |
| | | const fetchData = async (params) => { |
| | | setLoading(true); |
| | | try { |
| | | const data = await queryKbDocumentList(params); |
| | | console.log(data, 'data'); |
| | | if(data.code=='0'){ |
| | | // 详情 |
| | | // const kbtenantInfo = await queryKbtenantInfo(); |
| | | const data = await queryKbDocumentList(params); |
| | | if (data.code == '0') { |
| | | parser_ids = kbtenantInfo.parser_ids.split(',').reduce((acc, pair) => { |
| | | const [key, value] = pair.split(':'); |
| | | acc[key] = value; |
| | |
| | | }, {}); |
| | | // console.log(parser_ids, 'parser_ids'); |
| | | kbtenantInfo.parser_idObj = parser_ids; |
| | | renderData.value = data.data.docs||[]; |
| | | renderData.value = data.data.docs || []; |
| | | renderData.value = renderData.value.map((item) => { |
| | | return { |
| | | ...item, |
| | |
| | | parser_id: parser_ids[item.parser_id], |
| | | }; |
| | | }); |
| | | console.log(renderData.value, 'renderData'); |
| | | // console.log(renderData.value, 'renderData'); |
| | | |
| | | pagination.current = params.page; |
| | | pagination.page = params.page; |
| | | pagination.total = data.data.total; |
| | | // 查询知识库详情 |
| | | kbdetail = await queryKbdetail({ |
| | | kb_id:params.kb_id, |
| | | }); |
| | | |
| | | } |
| | | } catch (err) { |
| | | // you can report use errorHandler or other |
| | |
| | | fetchData({ |
| | | kb_id: kbobj.id, |
| | | page: 1, |
| | | page_size: 20, |
| | | keywords:keywords.value |
| | | }) |
| | | page_size: 10, |
| | | keywords: keywords.value, |
| | | }); |
| | | }; |
| | | |
| | | const handleClick = ()=>{ |
| | | const handleClick = () => { |
| | | visible.value = true; |
| | | } |
| | | }; |
| | | |
| | | const onPageChange = (current: number) => { |
| | | fetchData({ ...basePagination, current }); |
| | | fetchData({ ...basePagination, page: current, kb_id: kbobj.id }); |
| | | }; |
| | | |
| | | const knowledgeData = async ( |
| | | params = { page: 1, page_size: 20 } |
| | | ) => { |
| | | setLoading(true); |
| | | const selectTabAll = (val) => { |
| | | console.log(val, '全选'); |
| | | checkedAll.value = val; |
| | | }; |
| | | const selectTabChange = (val) => { |
| | | console.log(val, '单选'); |
| | | checkedArr.value = val; |
| | | }; |
| | | |
| | | const knowledgeData = async (params = { page: 1, page_size: 10 }) => { |
| | | listloading.value = true; |
| | | try { |
| | | const { data } = await queryKbList(params); |
| | | console.log(data, 'data'); |
| | | // console.log(data, 'data'); |
| | | tabs.value = data; |
| | | console.log(tabs.value, 'tabs'); |
| | | if(tabs.value.length>0 && tabs.value[0]){ |
| | | kbobj = tabs.value[0] |
| | | // console.log(tabs.value, 'tabs'); |
| | | if (tabs.value.length > 0 && tabs.value[0]) { |
| | | kbobj = tabs.value[0]; |
| | | kbId = kbobj.id; |
| | | testForm.value.changekbid(kbId); |
| | | configForm.value.changekbObj(kbobj); |
| | | activeKey.value = '1'; |
| | | fetchData({ |
| | | kb_id: kbobj.id, |
| | | page: 1, |
| | | page_size: 20 |
| | | }) |
| | | page_size: 10, |
| | | }); |
| | | getKbdetail(kbobj.id); |
| | | } else { |
| | | } |
| | | // renderData.value = data.list; |
| | | // console.log(renderData, 'renderData'); |
| | |
| | | } catch (err) { |
| | | // you can report use errorHandler or other |
| | | } finally { |
| | | listloading.value = false; |
| | | } |
| | | }; |
| | | |
| | | const getKbdetail = async (kb_id) => { |
| | | // 查询知识库详情 |
| | | const data = await queryKbdetail({ |
| | | kb_id: kb_id, |
| | | }); |
| | | kbdetail = data.data; |
| | | testForm.value.changekbid(kbdetail.id); |
| | | configForm.value.changekbObj(kbdetail); |
| | | }; |
| | | |
| | | const getknowledge = async (id) => { |
| | | setLoading(true); |
| | | try { |
| | | const { data } = await queryKbList({ page: 1, page_size: 10 }); |
| | | console.log(data, '查询知识库列表'); |
| | | tabs.value = data; |
| | | if (tabs.value.length > 0) { |
| | | // 定位到新增的知识库单元 |
| | | selectedTab.value = tabs.value.findIndex((item) => item.id == id); |
| | | getKbdetail(id); // 获取详情 |
| | | activeKey.value = '3'; |
| | | } |
| | | } 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 deleteKnowledge = (id) => { |
| | | Modal.confirm({ |
| | | title: '提示信息', |
| | | content: '确认删除吗', |
| | | okText: '确定', |
| | | cancelText: '取消', |
| | | hideTitle: true, |
| | | onOk: async () => { |
| | | let data = await deleteKnow({ |
| | | kb_id: id, |
| | | }); |
| | | if (data.code == 0) { |
| | | Message.success('删除成功'); |
| | | knowledgeData(); |
| | | } |
| | | }, |
| | | onCancel: () => {}, |
| | | }); |
| | | }; |
| | | const reset = () => { |
| | | formModel.value = generateFormModel(); |
| | | }; |
| | | |
| | | function handleTabChange(key) { |
| | | // 处理标签改变事件 |
| | | console.log('Changed to tab:', key); |
| | | activeKey.value = key; |
| | | } |
| | | |
| | | const handleSelectDensity = ( |
| | | val: string | number | Record<string, any> | undefined, |
| | |
| | | size.value = val as SizeProps; |
| | | }; |
| | | |
| | | const handleChange = ( |
| | | checked: boolean | (string | boolean | number)[], |
| | | column: Column, |
| | | index: number |
| | | ) => { |
| | | if (!checked) { |
| | | cloneColumns.value = showColumns.value.filter( |
| | | (item) => item.dataIndex !== column.dataIndex |
| | | ); |
| | | const cancleConfig = () => { |
| | | activeKey.value = '1'; |
| | | let id = tabs.value[selectedTab.value].id; |
| | | fetchData({ |
| | | kb_id: id, |
| | | page: 1, |
| | | page_size: 10, |
| | | }); |
| | | }; |
| | | |
| | | const saveConfig = async () => { |
| | | activeKey.value = '1'; |
| | | let id = tabs.value[selectedTab.value].id; |
| | | const { data } = await queryKbList({ page: 1, page_size: 10 }); |
| | | tabs.value = data; |
| | | fetchData({ |
| | | kb_id: id, |
| | | page: 1, |
| | | page_size: 10, |
| | | }); |
| | | getKbdetail(id); // 获取详情 |
| | | }; |
| | | |
| | | const enableDisable = async (type) => { |
| | | Promise.all( |
| | | checkedArr.value.map(async (item) => { |
| | | await changeStatus({ |
| | | doc_id: item, |
| | | status: type, |
| | | }); |
| | | }) |
| | | ).then(() => { |
| | | Message.success('更新成功'); |
| | | getKbList(); |
| | | }); |
| | | }; |
| | | |
| | | //批量启用删除禁用 |
| | | const addBlock = async (type) => { |
| | | if (type != 3) { |
| | | //启动和取消 |
| | | let data = await kbdocumentrun({ |
| | | doc_ids: checkedArr.value, |
| | | run: type, |
| | | }); |
| | | if (data.code == 0) { |
| | | checkedArr.value.forEach(async (item) => { |
| | | tabs.value.forEach(async (items) => { |
| | | if (items.id == item) { |
| | | items.loading = true; |
| | | } |
| | | }); |
| | | }); |
| | | // fetchData({ |
| | | // kb_id: tabs.value[selectedTab.value].id, |
| | | // page: 1, |
| | | // page_size: 20, |
| | | // }); |
| | | getKbList(); |
| | | } else { |
| | | // Message.error('解析失败'); |
| | | // row.run = '1'; |
| | | } |
| | | } else { |
| | | cloneColumns.value.splice(index, 0, column); |
| | | //批量删除 |
| | | Modal.confirm({ |
| | | title: '提示信息', |
| | | content: '确认删除吗', |
| | | okText: '确定', |
| | | cancelText: '取消', |
| | | hideTitle: true, |
| | | onOk: async () => { |
| | | let data = await kbdocumentrm({ doc_id: checkedArr.value }); |
| | | if (data.code == 0) { |
| | | Message.success('删除成功'); |
| | | getKbList(); |
| | | } |
| | | }, |
| | | onCancel: () => {}, |
| | | }); |
| | | } |
| | | }; |
| | | |
| | | const getKbList = async () => { |
| | | await fetchData({ |
| | | kb_id: tabs.value[selectedTab.value].id, |
| | | page: 1, |
| | | page_size: 10, |
| | | }); |
| | | }; |
| | | |
| | | const exchangeArray = <T extends Array<any>>( |
| | |
| | | } |
| | | }; |
| | | |
| | | const fileClick = ()=>{ |
| | | detailsShow.value = true |
| | | const fileClick = () => { |
| | | detailsShow.value = true; |
| | | }; |
| | | |
| | | } |
| | | const goBackClick = () => { |
| | | detailsShow.value = false; |
| | | }; |
| | | |
| | | const goBackClick = ()=>{ |
| | | detailsShow.value = false |
| | | |
| | | } |
| | | function upTabdateItem(id, newName) { |
| | | console.log(id, newName); |
| | | const itemToUpdate = renderData.value.find(item => item.id === id); |
| | | const itemToUpdate = renderData.value.find((item) => item.id === id); |
| | | if (itemToUpdate) { |
| | | itemToUpdate.name = newName; |
| | | } |
| | | } |
| | | |
| | | const deleteItem = async (row)=>{ |
| | | const deleteItem = async (row) => { |
| | | console.log(row); |
| | | let data = await kbdocumentrm({doc_id: row.id}) |
| | | if(data.code == 0){ |
| | | let data = await kbdocumentrm({ doc_id: row.id }); |
| | | if (data.code == 0) { |
| | | Message.success('删除成功'); |
| | | console.log(kbobj, 'kbobj'); |
| | | // console.log(kbobj, 'kbobj'); |
| | | fetchData({ |
| | | kb_id: kbobj.id, |
| | | page: 1, |
| | | page_size: 20 |
| | | }) |
| | | page_size: 10, |
| | | }); |
| | | } |
| | | } |
| | | const onDownloadDocument = async (record)=>{ |
| | | }; |
| | | const onDownloadDocument = async (record) => { |
| | | console.log(record); |
| | | downloadFile({ |
| | | await downloadFile({ |
| | | url: `/api/v1/document/get/${record.id}`, |
| | | filename: record.name, |
| | | }); |
| | | } |
| | | const seeload = async (row)=>{ |
| | | Object.assign(seeObj, row) |
| | | // console.log(seeObj.name, 'seeObj'); |
| | | let type = row.name.split('.')[1]; |
| | | console.log(type); |
| | | if(type=='pdf'){ |
| | | documenttype.value = 'txtPdf' |
| | | }else if(type=='docx'){ |
| | | documenttype.value = 'docx' |
| | | }else if(type=='xlsx'){ |
| | | documenttype.value = 'excel' |
| | | }else if(type=='txt'){ |
| | | documenttype.value = 'txtPdf' |
| | | }else { |
| | | return false |
| | | } |
| | | previewSrc.value = `${import.meta.env.VITE_API_BASE_URL}/v1/document/get/${row.id}` |
| | | visible.value = true; |
| | | }; |
| | | const previewArea = async (row) => { |
| | | Object.assign(seeObj, row); |
| | | // console.log(seeObj.name, 'seeObj'); |
| | | let type = row.name.split('.')[1]; |
| | | console.log(type); |
| | | if (type == 'pdf') { |
| | | documenttype.value = 'txtPdf'; |
| | | } else if (type == 'docx') { |
| | | documenttype.value = 'docx'; |
| | | } else if (type == 'xlsx') { |
| | | documenttype.value = 'excel'; |
| | | } else if (type == 'txt') { |
| | | documenttype.value = 'txtPdf'; |
| | | } else { |
| | | return false; |
| | | } |
| | | |
| | | } |
| | | previewSrc.value = `${import.meta.env.VITE_API_BASE_URL}/v1/document/get/${ |
| | | row.id |
| | | }`; |
| | | // previewSrc.value = `${ httpUrl }/v1/document/get/${row.id}` |
| | | visible.value = true; |
| | | }; |
| | | |
| | | const handleChangeStatus = async (row)=>{ |
| | | console.log(row); |
| | | let data = await kbdocumentchangeStatus({ |
| | | doc_id: row.id, |
| | | status: row.status |
| | | }) |
| | | if(data.code == 0){ |
| | | Message.success('操作成功'); |
| | | } |
| | | } |
| | | const handleChangeStatus = async (row) => { |
| | | console.log(row); |
| | | let data = await kbdocumentchangeStatus({ |
| | | doc_id: row.id, |
| | | status: row.status, |
| | | }); |
| | | if (data.code == 0) { |
| | | Message.success('操作成功'); |
| | | } |
| | | }; |
| | | |
| | | const run = async (row) => { |
| | | row.loading = true; |
| | | let run; |
| | | if (row.run == '0') { |
| | | run = '1'; |
| | | } else if (row.run == '1') { |
| | | run = '2'; |
| | | } else if (row.run == '2') { |
| | | run = '1'; |
| | | } else { |
| | | run = '1'; |
| | | } |
| | | let data = await kbdocumentrun({ |
| | | doc_ids: [row.id], |
| | | run: run, |
| | | }); |
| | | if (data.code == 0) { |
| | | fetchData({ |
| | | kb_id: tabs.value[selectedTab.value].id, |
| | | page: 1, |
| | | page_size: 10, |
| | | }); |
| | | } else { |
| | | // Message.error('解析失败'); |
| | | // row.run = '1'; |
| | | } |
| | | |
| | | const run = async (row)=>{ |
| | | console.log(row); |
| | | row.loading = true; |
| | | let run = '1' |
| | | if(row.run!='2'){ |
| | | run = '1' |
| | | }else { |
| | | run = '2' |
| | | } |
| | | let data = await kbdocumentrun({ |
| | | doc_ids: [row.id], |
| | | run: run |
| | | }) |
| | | if(data.code == 0){ |
| | | Message.success('解析成功'); |
| | | row.run = '3'; |
| | | }else{ |
| | | Message.error('解析失败'); |
| | | row.run = '1'; |
| | | } |
| | | row.loading = false; |
| | | } |
| | | row.loading = false; |
| | | }; |
| | | |
| | | const changeFetchData = async (row)=>{ |
| | | fetchData({ |
| | | kb_id: kbobj.id, |
| | | page: 1, |
| | | page_size: 20 |
| | | }) |
| | | } |
| | | const changeFetchData = async (row) => { |
| | | fetchData({ |
| | | kb_id: kbobj.id, |
| | | page: 1, |
| | | page_size: 10, |
| | | }); |
| | | }; |
| | | watch( |
| | | () => columns.value, |
| | | (val) => { |
| | |
| | | { deep: true, immediate: true } |
| | | ); |
| | | |
| | | onBeforeMount(()=>{ |
| | | |
| | | }) |
| | | onMounted(()=>{ |
| | | knowledgeData() |
| | | }) |
| | | |
| | | </script> |
| | | |
| | | <script lang="ts"> |
| | | export default { |
| | | name: 'SearchTable', |
| | | methods: { |
| | | |
| | | } |
| | | }; |
| | | onBeforeMount(async () => { |
| | | // const {data} = await queryKbtenantInfo(); |
| | | // Object.assign(kbtenantInfo,data); |
| | | // console.log(kbtenantInfo,'kbtenantInfo的数据'); |
| | | }); |
| | | onMounted(() => { |
| | | knowledgeData(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="less"> |
| | | .container { |
| | | padding: 0 20px 20px 20px; |
| | | .main-container{ |
| | | |
| | | .main-container { |
| | | display: flex; |
| | | width: 100%; |
| | | height: 100%; |
| | | .lf-container{ |
| | | |
| | | .lf-container { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: space-evenly; |
| | | background: #ffffff; |
| | | //justify-content: space-evenly; |
| | | border-radius: 8px; |
| | | background: var(--color-bg-2); |
| | | width: 200px; |
| | | .lf-container-top{ |
| | | |
| | | .lf-container-top { |
| | | display: flex; |
| | | margin: 10px 0; |
| | | } |
| | | .lf-container-down{ |
| | | |
| | | .lf-container-down { |
| | | display: flex; |
| | | flex-direction: column; |
| | | box-sizing: border-box; |
| | | width: 90%; |
| | | //height: 56rem; |
| | | border: 1px solid #eeeeee; |
| | | height: calc(100% - 80px); |
| | | border: 1px solid var(--color-fill-3); |
| | | border-radius: 8px; |
| | | //padding: 10px; |
| | | margin-bottom: 10px; |
| | | //.tabs{ |
| | |
| | | cursor: pointer; |
| | | box-sizing: border-box; |
| | | margin: 10px 10px; |
| | | padding:0 10px; |
| | | color: rgba(0, 0, 0, 0.88); |
| | | padding: 0 10px; |
| | | padding-right: 20%; |
| | | font-size: 14px; |
| | | height: 40px; |
| | | line-height: 40px; |
| | | list-style: none; |
| | | position: relative; |
| | | background: #ffffff; |
| | | border: 1px solid #f0f0f0; |
| | | color: var(--color-text-1); |
| | | border: 1px solid var(--color-neutral-3); |
| | | background: var(--color-bg-2); |
| | | border-radius: 8px; |
| | | overflow: hidden; /* 确保超出容器的文本被隐藏 */ |
| | | white-space: nowrap; /* 防止文本换行 */ |
| | | text-overflow: ellipsis; /* 超出部分显示省略号 */ |
| | | } |
| | | |
| | | .tab:hover { |
| | | border: 1px solid #ffffff; |
| | | color: #2a2a2b; |
| | | border: 1px solid var(--color-neutral-3); |
| | | background: #e8e8ea; |
| | | box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12), 0 5px 12px 4px rgba(0, 0, 0, 0.09); |
| | | box-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), |
| | | 0 3px 6px 0 rgba(0, 0, 0, 0.12), |
| | | 0 5px 12px 4px rgba(0, 0, 0, 0.09); |
| | | } |
| | | |
| | | .tab.active { |
| | | border: 1px solid #e8e8ea; |
| | | color: #2a2a2b; |
| | | border: 1px solid var(--color-neutral-1); |
| | | background: #e8e8ea; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | } |
| | | .rt-container{ |
| | | |
| | | .rt-container { |
| | | position: relative; |
| | | //background: #626aea; |
| | | margin-left: 20px; |
| | | width: calc(100% - 200px); |
| | | height: 56rem; |
| | | .rt-container-main{ |
| | | height: 76vh; |
| | | overflow: hidden; |
| | | |
| | | .rt-container-main { |
| | | overflow: auto; |
| | | } |
| | | .details{ |
| | | |
| | | .details { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | background: #ffffff; |
| | | .details-header{ |
| | | |
| | | .details-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-top: 10px; |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | :deep(.arco-table-th) { |
| | | &:last-child { |
| | | .arco-table-th-item-title { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | .action-icon { |
| | | margin-left: 12px; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .active { |
| | | color: #0960bd; |
| | | background-color: #e3f4fc; |
| | | } |
| | | |
| | | .setting { |
| | | display: flex; |
| | | align-items: center; |
| | | width: 200px; |
| | | |
| | | .title { |
| | | margin-left: 12px; |
| | | cursor: pointer; |