@@ -34,19 +34,18 @@ const batchSaving = ref(false);
const resolvingNode = ref ( false ) ;
const nodeResolved = ref ( false ) ;
const sourceTitle = ref ( "" ) ;
const filter = reactive ( { keyword : "" , type : "" , open : "" , source : "" , pending : "" } ) ;
const filter = reactive ( { keyword : "" , type : "" , open : "" , source : "" } ) ;
const pager = reactive ( { page : 1 , pageSize : 20 , total : 0 } ) ;
const form = reactive ( {
name : "" ,
feishuSpaceId : "" ,
feishuNodeId : "" ,
knowledgeType : "general" ,
reviewMode : "manual" ,
status : 0 ,
remark : "" ,
} ) ;
const editForm = reactive ( { id : 0 , name : "" , knowledgeType : "general" , reviewMode : "manual" } ) ;
const batchForm = reactive ( { knowledgeType : "" , reviewMode : "" } ) ;
const editForm = reactive ( { id : 0 , name : "" , knowledgeType : "general" } ) ;
const batchForm = reactive ( { knowledgeType : "" } ) ;
onMounted ( load ) ;
@@ -55,7 +54,7 @@ async function load(page = pager.page, pageSize = pager.pageSize) {
try {
const result = await api . knowledge ( {
keyword : filter . keyword , knowledgeType : filter . type , openStatus : filter . open ,
sourceStatus : filter . source , pending : filter . pending === "" ? undefined : filter . pending === "yes" ,
sourceStatus : filter . source ,
page , pageSize ,
} ) ;
rows . value = result . items ;
@@ -74,7 +73,6 @@ function openEdit() {
id : detail . value . knowledge . id ,
name : detail . value . knowledge . name ,
knowledgeType : detail . value . knowledge . knowledgeType ,
reviewMode : detail . value . knowledge . reviewMode ,
} ) ;
editOpen . value = true ;
}
@@ -87,7 +85,7 @@ async function saveMetadata() {
editSaving . value = true ;
try {
await api . updateKnowledgeMetadata ( editForm . id , {
name : editForm . name . trim ( ) , knowledgeType : editForm . knowledgeType , reviewMode : editForm . reviewMode ,
name : editForm . name . trim ( ) , knowledgeType : editForm . knowledgeType ,
} ) ;
ElMessage . success ( "知识库基本信息已更新" ) ;
editOpen . value = false ;
@@ -104,13 +102,13 @@ function openBatchEdit() {
ElMessage . warning ( "请先勾选需要修改的知识库" ) ;
return ;
}
Object . assign ( batchForm , { knowledgeType : "" , reviewMode : "" } ) ;
Object . assign ( batchForm , { knowledgeType : "" } ) ;
batchOpen . value = true ;
}
async function saveBatchMetadata ( ) {
if ( ! batchForm . knowledgeType && ! batchForm . reviewMode ) {
ElMessage . warning ( "请至少选择一个修改项 " ) ;
if ( ! batchForm . knowledgeType ) {
ElMessage . warning ( "请选择知识库类型 " ) ;
return ;
}
if ( ! await confirmAction (
@@ -123,7 +121,6 @@ async function saveBatchMetadata() {
const result = await api . batchUpdateKnowledgeMetadata ( {
knowledgeIds : selectedRows . value . map ( ( item ) => item . id ) ,
knowledgeType : batchForm . knowledgeType || undefined ,
reviewMode : batchForm . reviewMode || undefined ,
} ) ;
ElMessage [ result . failed ? "warning" : "success" ] ( ` 批量修改完成:成功 ${ result . success } 个,失败 ${ result . failed } 个 ` ) ;
batchOpen . value = false ;
@@ -168,9 +165,9 @@ async function createKnowledge() {
}
try {
await api . createKnowledge ( { ... form } ) ;
Object . assign ( form , { name : "" , feishuSpaceId : "" , feishuNodeId : "" , knowledgeType : "general" , reviewMode : "manual" , status : 0 , remark : "" } ) ;
Object . assign ( form , { name : "" , feishuSpaceId : "" , feishuNodeId : "" , knowledgeType : "general" , status : 0 , remark : "" } ) ;
nodeResolved . value = false ; sourceTitle . value = "" ;
ElMessage . success ( "知识库已新增,请进行 首次同步" ) ;
ElMessage . success ( "知识库已新增,首次同步成功后将自动生效 " ) ;
await load ( ) ;
} catch ( error ) {
ElMessage . error ( errorMessage ( error , "知识库新增失败" ) ) ;
@@ -216,15 +213,15 @@ async function refreshDetail(id: number) {
return nextDetail ;
}
async function sync ( item : KnowledgeItem , mode : "review" | "replace" ) {
async function sync ( item : KnowledgeItem ) {
operatingId . value = item . id ;
try {
const result = await api . syncKnowledge ( item . id , mode );
const result = await api . syncKnowledge ( item . id ) ;
const message = result . status === "unchanged"
? "飞书内容未变化,未生成新版本"
: result . status === "published"
? "同步、质检和自动发布已 完成"
: "同步处理完成,已生成待审核版本 " ;
? "同步完成,最新版本已自动生效 "
: "同步完成 " ;
ElMessage . success ( message ) ;
await load ( ) ;
if ( detailOpen . value ) await refreshDetail ( item . id ) ;
@@ -237,7 +234,7 @@ async function sync(item: KnowledgeItem, mode: "review" | "replace") {
async function runMigration ( ) {
if ( ! await confirmAction (
"将依次重新读取全部现有 飞书文章并生成待审核版本。迁移审核完成前,新检索链路不会使用这些知识库 。" ,
"将依次重新读取全部飞书文章。每个知识库同步成功后会立即替换为最新版本,原版本仍可回滚 。" ,
"开始知识迁移" ,
{ confirmButtonText : "开始迁移" , cancelButtonText : "取消" , type : "warning" } ,
) ) return ;
@@ -253,58 +250,6 @@ async function runMigration() {
}
}
async function confirmManifest ( ) {
if ( ! detail . value ? . pendingVersion ) return ;
try {
await api . confirmKnowledgeManifest ( detail . value . knowledge . id , detail . value . pendingVersion . id ) ;
ElMessage . success ( "知识库说明卡已确认" ) ;
await refreshDetail ( detail . value . knowledge . id ) ;
} catch ( error ) {
ElMessage . error ( errorMessage ( error , "说明卡确认失败" ) ) ;
}
}
async function review ( action : "approve" | "reject" ) {
if ( ! detail . value ? . pendingVersion ) return ;
let reason = "" ;
if ( action === "reject" ) {
try {
const result = await ElMessageBox . prompt (
"请记录拒绝原因。知识内容不能在后台修改,请前往飞书源文章修改后重新同步。" ,
"拒绝版本" ,
{ confirmButtonText : "确认拒绝" , cancelButtonText : "取消" , inputValidator : ( value ) => Boolean ( value ? . trim ( ) ) || "请填写拒绝原因" } ,
) ;
reason = result . value ;
} catch {
return ;
}
}
try {
await api . reviewKnowledgeVersion ( detail . value . knowledge . id , detail . value . pendingVersion . id , action , reason ) ;
ElMessage . success ( action === "approve" ? "版本已审核通过" : "版本已拒绝" ) ;
await refreshDetail ( detail . value . knowledge . id ) ;
} catch ( error ) {
ElMessage . error ( errorMessage ( error , "版本审核失败" ) ) ;
}
}
async function publish ( keepOpen : boolean ) {
if ( ! detail . value ? . pendingVersion ) return ;
if ( ! await confirmAction (
` 将发布 V ${ detail . value . pendingVersion . versionNo } ,从用户下一条消息开始生效;发布后知识库将 ${ keepOpen ? "保持开放" : "处于关闭状态" } 。 ` ,
"发布知识版本" ,
{ confirmButtonText : "确认发布" , cancelButtonText : "取消" , type : "warning" } ,
) ) return ;
try {
await api . publishKnowledgeVersion ( detail . value . knowledge . id , detail . value . pendingVersion . id , keepOpen ) ;
ElMessage . success ( "正式版本已发布" ) ;
await load ( ) ;
await refreshDetail ( detail . value . knowledge . id ) ;
} catch ( error ) {
ElMessage . error ( errorMessage ( error , "版本发布失败" ) ) ;
}
}
async function rollback ( version : KnowledgeVersion ) {
if ( ! detail . value ) return ;
if ( ! await confirmAction (
@@ -399,14 +344,13 @@ async function confirmAction(
< template >
< div class = "page-head inline" >
< div > < h2 > 知识库管理 < / h2 > < p > 一篇飞书文章对应一个知识库 ; 同步 、 审核和发布相互独立 。 < / p > < / div >
< div > < h2 > 知识库管理 < / h2 > < p > 一篇飞书文章对应一个知识库 ; 同步成功后最新版本自动生效 , 历史版本可随时回滚 。 < / p > < / div >
< el-button type = "primary" :loading = "loading" @click ="runMigration" > 迁移现有知识库 < / el -button >
< / div >
< section class = "migration-overview" >
< div > < span > 知识库总数 < / span > < strong > { { migration ? . total ? ? 0 } } < / strong > < / div >
< div > < span > 待迁移 < / span > < strong > { { migration ? . counts . pending ? ? 0 } } < / strong > < / div >
< div > < span > 待审核 < / span > < strong > { { migration ? . counts . pending _review ? ? 0 } } < / strong > < / div >
< div > < span > 迁移完成 < / span > < strong > { { migration ? . counts . completed ? ? 0 } } < / strong > < / div >
< div > < span > 失败 < / span > < strong > { { migration ? . counts . failed ? ? 0 } } < / strong > < / div >
< / section >
@@ -425,11 +369,8 @@ async function confirmAction(
< el-select v-model = "form.knowledgeType" >
< el -option label = "课程知识库" value = "course" / > < el-option label = "答疑知识库" value = "qa" / > < el-option label = "通用知识库" value = "general" / >
< / el-select >
< el-select v-model = "form.reviewMode" >
< el -option label = "必须人工审核" value = "manual" / > < el-option label = "允许自动发布" value = "automatic" / >
< / el-select >
< el-input v-model = "form.remark" placeholder="备注(可修改)" / >
< el-button type = "primary" @click ="createKnowledge" > 保存并准备同步 < / el -button >
< el-button type = "primary" @click ="createKnowledge" > 保存知识库 < / el -button >
< / div >
< / section >
@@ -438,46 +379,42 @@ async function confirmAction(
< el-select v-model = "filter.type" placeholder="知识库类型" clearable @change="load(1)"><el-option label="课程" value="course" /><el-option label="答疑" value="qa" /><el-option label="通用" value="general" / > < / el-select >
< el-select v-model = "filter.open" placeholder="开放状态" clearable @change="load(1)"><el-option label="已开放" value="1" /><el-option label="已关闭" value="0" / > < / el-select >
< el-select v-model = "filter.source" placeholder="源状态" clearable @change="load(1)"><el-option label="正常" value="normal" /><el-option label="源异常" value="error" / > < / el-select >
< el-select v-model = "filter.pending" placeholder="待发布版本" clearable @change="load(1)"><el-option label="有待发布版本" value="yes" /><el-option label="无待发布版本" value="no" / > < / el-select >
< / div >
< div class = "knowledge-batch-bar" >
< span > 已选择 { { selectedRows . length } } 个知识库 < / span >
< el-button : disabled = "selectedRows.length === 0" @click ="openBatchEdit" > 批量修改类型 / 审核方式 </ el -button >
< el-button : disabled = "selectedRows.length === 0" @click ="openBatchEdit" > 批量修改类型 < / el -button >
< / div >
< el-table v-loading = "loading" :data="rows" stripe @selection-change="selectedRows = $event" >
< el -table -column type = "selection" width = "48" / >
< el-table-column label = "知识库" min -width = " 240 " > < template # default = "{ row }" > < strong > { { row . name } } < / strong > < small class = "table-subline" > { { row . sourceTitle || "尚未同步源标题" } } < / small > < / template > < / el-table-column >
< el-table-column label = "类型/审核 " width = "15 0" > < template # default = "{ row }" > { { typeLabel ( row . knowledgeType ) } } < small class = "table-subline" > { { row . reviewMode === 'manual' ? '人工审核' : '允许自动发布' } } < / small > < / template > < / el-table-column >
< el-table-column label = "版本" width = "130" > < template # default = "{ row }" > < span > 正式 { { row . currentVersionId ? ` # ${ row . currentVersionId } ` : '无 ' } } < / span > < small class = "table-subline" > 待发布 { { row . pendingVersionId ? ` # ${ row . pendingVersionId } ` : '无' } } < / small > < / template > < / el-table-column >
< el-table-column label = "类型" width = "14 0" > < template # default = "{ row }" > { { typeLabel ( row . knowledgeType ) } } < / template > < / el-table-column >
< el-table-column label = "当前 版本" width = "130" > < template # default = "{ row }" > < span > { { row . currentVersionId ? ` # ${ row . currentVersionId } ` : '尚未同步 ' } } < / span > < / template > < / el-table-column >
< el-table-column label = "状态" width = "210" > < template # default = "{ row }" > < div class = "knowledge-status-cell" > < el-switch v-model = "row.status" :active-value="1" :inactive-value="0" active-text="开放" inactive-text="关闭" inline-prompt :loading="operatingId === row.id" :disabled="row.lifecycleStatus === 'archived'" :before-change="() => toggleOpen(row)" /><el-tag :type="statusType(row.sourceStatus)" > {{ row.sourceStatus = = = ' normal ' ? ' 源正常 ' : ' 源异常 ' }} < / el -tag > < / div > < / template > < / el-table-column >
< el-table-column prop = "lastSyncedAt" label = "最近同步" width = "180" / >
< el-table-column label = "操作" width = "220" fixed = "right" > < template # default = "{ row }" > < TableRowActions > < el-button link type = "primary" @click ="openDetail(row)" > 详情 < / el -button > < el-button link type = "primary" : disabled = "row.lifecycleStatus === 'archived'" : loading = "operatingId === row.id" @click ="sync(row, 'review' )" > 同步 < / el -button > < el-dropdown trigger = "click" :teleported = "true" @command ="handleMore($event, row)" > < el -button link type = "primary" > 更多 < / el-button > < template # dropdown > < el-dropdown-menu > < el-dropdown-item command = "detail" > 查看详情 < / el-dropdown-item > < el-dropdown-item command = "preview" > 进入 Agent 预览 < / el-dropdown-item > < el-dropdown-item command = "versions" > 查看版本 < / el-dropdown-item > < el-dropdown-item v-if = "row.lifecycleStatus === 'active'" command="archive" divided>归档</el-dropdown-item><el-dropdown-item v-else command="restore" divided>恢复</el-dropdown-item><el-dropdown-item command="delete" :disabled="row.lifecycleStatus !== 'archived'" divided > 删除 < / el-dropdown-item > < / el-dropdown-menu > < / template > < / el-dropdown > < / TableRowActions > < / template > < / el-table-column >
< el-table-column label = "操作" width = "220" fixed = "right" > < template # default = "{ row }" > < TableRowActions > < el-button link type = "primary" @click ="openDetail(row)" > 详情 < / el -button > < el-button link type = "primary" : disabled = "row.lifecycleStatus === 'archived'" : loading = "operatingId === row.id" @click ="sync(row)" > 同步最新版本 < / el -button > < el-dropdown trigger = "click" :teleported = "true" @command ="handleMore($event, row)" > < el -button link type = "primary" > 更多 < / el-button > < template # dropdown > < el-dropdown-menu > < el-dropdown-item command = "detail" > 查看详情 < / el-dropdown-item > < el-dropdown-item command = "preview" > 进入 Agent 预览 < / el-dropdown-item > < el-dropdown-item command = "versions" > 查看版本 < / el-dropdown-item > < el-dropdown-item v-if = "row.lifecycleStatus === 'active'" command="archive" divided>归档</el-dropdown-item><el-dropdown-item v-else command="restore" divided>恢复</el-dropdown-item><el-dropdown-item command="delete" :disabled="row.lifecycleStatus !== 'archived'" divided > 删除 < / el-dropdown-item > < / el-dropdown-menu > < / template > < / el-dropdown > < / TableRowActions > < / template > < / el-table-column >
< / el-table >
< AdminPagination :page = "pager.page" :page-size = "pager.pageSize" :total = "pager.total" @change ="load" / >
< el-drawer v-model = "detailOpen" size="76%" title="知识库详情" destroy -on -close >
< template v-if = "detail" >
< div class = "knowledge-detail-head" >
< div > < h3 > { { detail . knowledge . name } } < / h3 > < p > { { typeLabel ( detail . knowledge . knowledgeType ) } } · { { detail . knowledge . reviewMode === 'manual' ? '必须人工审核' : '允许自动发布' } } < / p > < / div >
< div > < h3 > { { detail . knowledge . name } } < / h3 > < p > { { typeLabel ( detail . knowledge . knowledgeType ) } } · 同步后自动生效 < / p > < / div >
< div class = "knowledge-detail-head-actions" > < el-button type = "primary" plain @click ="activeTab = 'content'" > 预览内容 < / el -button > < el-tag : type = "detail.knowledge.status === 1 ? 'success' : 'info'" > { { detail . knowledge . status === 1 ? '已开放' : '已关闭' } } < / el-tag > < el-tag :type = "statusType(detail.knowledge.sourceStatus)" > { { detail . knowledge . sourceStatus === 'normal' ? '源文章正常' : '源文章异常' } } < / el-tag > < / div >
< / div >
< el-alert v-if = "detail.knowledge.sourceError" :title="detail.knowledge.sourceError" type="error" :closable="false" / >
< el-tabs v-model = "activeTab" >
< el -tab -pane label = "基本信息" name = "overview" >
< div class = "knowledge-section-head" > < h4 > 基本信息 < / h4 > < el-button type = "primary" plain @click ="openEdit" > 编辑基本信息 < / el -button > < / div >
< dl class = "knowledge-meta" > < dt > 后台名称 < / dt > < dd > { { detail . knowledge . name } } < / dd > < dt > 知识库类型 < / dt > < dd > { { typeLabel ( detail . knowledge . knowledgeType ) } } < / dd > < dt > 审核方式 < / dt > < dd > { { detail . knowledge . reviewMode === 'manual' ? '必须人工审核发布' : '允许自动处理后发布' } } < / dd > < dt > SpaceID < / dt > < dd > { { detail . knowledge . feishuSpaceId } } < / dd > < dt > NodeID < / dt > < dd > { { detail . knowledge . feishuNodeId } } < / dd > < dt > 正式 版本< / dt > < dd > { { detail . currentVersion ? ` V ${ detail . currentVersion . versionNo } ` : '暂无' } } < / dd > < dt > 待发布版本 < / dt > < dd > { { detail . pendingVersion ? ` V ${ detail . pendingVersion . versionNo } ` : '暂无' } } < / dd > < / dl >
< section v-if = "detail.manifest" class="manifest-panel"><h4> Knowledge Manifest</h4><p><strong>用途:</strong>{{ detail. manifest. purpose }}</p><p><strong>适用:</strong>{{ detail. manifest. applicableQuestions }}</p><p><strong>不适用:</strong>{{ detail. manifest. inapplicableQuestions }}</p><p><strong>核心主题:</strong>{{ detail. manifest. coreTopics }}</p><p><strong>边界:</strong>{{ detail. manifest. boundaries }}</p><el-button v-if="!detail.manifest.confirmed && detail.pendingVersion" type="primary" @click="confirmManifest" > 确认说明卡 < /el -button > < / section >
< div v-if = "detail.pendingVersion?.status === 'pending_review'" class="version-actions"><el-button type="success" @click="review('approve')">审核通过</el-button><el-button type="danger" @click="review('reject')" > 审核拒绝 < / el -button > < / div >
< div v-else-if = "detail.pendingVersion?.status === 'approved'" class="version-actions"><el-button type="primary" @click="publish(true)">发布并保持开放</el-button><el-button @click="publish(false)" > 发布后关闭 < / el -button > < / div >
< el-alert v-else-if = "detail.pendingVersion?.status === 'rejected'" title="该版本已被拒绝,请在飞书修改源文章后重新同步。" type="warning" :closable="false" / >
< dl class = "knowledge-meta" > < dt > 后台名称 < / dt > < dd > { { detail . knowledge . name } } < / dd > < dt > 知识库类型 < / dt > < dd > { { typeLabel ( detail . knowledge . knowledgeType ) } } < / dd > < dt > 版本更新 < / dt > < dd > 同步成功后自动替换 < / dd > < dt > SpaceID < / dt > < dd > { { detail . knowledge . feishuSpaceId } } < / dd > < dt > NodeID < / dt > < dd > { { detail . knowledge . feishuNodeId } } < / dd > < dt > 当前 版本< / dt > < dd > { { detail . currentVersion ? ` V ${ detail . currentVersion . versionNo } ` : '暂无' } } < / dd > < / dl >
< section v-if = "detail.manifest" class="manifest-panel"> < h4 > Knowledge Manifest< / h4 > < p > < strong > 用途 : < / strong > { { detail. manifest. purpose } } < / p > < p > < strong > 适用 : < / strong > { { detail. manifest. applicableQuestions } } < / p > < p > < strong > 不适用 : < / strong > { { detail. manifest. inapplicableQuestions } } < / p > < p > < strong > 核心主题 : < / strong > { { detail. manifest. coreTopics } } < / p > < p > < strong > 边界 : < / strong > { { detail. manifest. boundaries } } < /p > < / section >
< / el-tab-pane >
< el-tab-pane label = "内容预览" name = "content" lazy >
< KnowledgeContentPreview v -model :version-id = "previewVersionId" :versions = "versions" / >
< / el-tab-pane >
< el-tab-pane label = "版本记录" name = "versions" > < el-table :data = "versions" > < el-table-column label = "版本" width = "90" > < template # default = "{ row }" > V { { row . versionNo } } < / template > < / el-table-column > < el-table-column prop = "status" label = "状态" width = "130" / > < el-table-column prop = "qualityStatus" label = "质检" width = "120" / > < el-table-column prop = "createdAt" label = "生成时间" / > < el-table-column prop = "publishedAt" label = "发布时间" / > < el-table-column label = "操作" width = "180" > < template # default = "{ row }" > < el-button link type = "primary" @click ="showVersion(row)" > 查看内容 < / el -button > < el-button v-if = "['published','superseded'].includes(row.status) && row.id !== detail?.knowledge.currentVersionId" link @click="rollback(row)" > 回滚 < / el -button > < / template > < / el-table-column > < / el-table > < / el-tab-pane >
< el-tab-pane label = "同步记录" name = "jobs" > < el-table :data = "jobs" > < el-table-column prop = "id" label = "任务" width = "80" / > < el-table-column prop = "mode" label = "模式" width = "110" / > < el-table-column prop = "status" label = "状态" width = "130" / > < el-table-column prop = "stage" label = "阶段" width = "130" / > < el-table-column label = "进度" width = "180" > < template # default = "{ row }" > < el-progress :percentage = "row.progress" / > < / template > < / el-table-column > < el-table-column prop = "sourceError" label = "失败原因" min -width = " 260 " / > < / el-table > < / el-tab-pane >
< el-tab-pane label = "同步记录" name = "jobs" > < el-table :data = "jobs" > < el-table-column prop = "id" label = "任务" width = "80" / > < el-table-column prop = "status" label = "状态" width = "130" / > < el-table-column prop = "stage" label = "阶段" width = "130" / > < el-table-column label = "进度" width = "180" > < template # default = "{ row }" > < el-progress :percentage = "row.progress" / > < / template > < / el-table-column > < el-table-column prop = "sourceError" label = "失败原因" min -width = " 260 " / > < / el-table > < / el-tab-pane >
< / el-tabs >
< / template >
< / el-drawer >
@@ -486,7 +423,6 @@ async function confirmAction(
< el-form label -position = " top " >
< el-form-item label = "后台知识库名称" required > < el-input v-model = "editForm.name" maxlength="100" show -word -limit / > < / el-form-item >
< el-form-item label = "知识库类型" required > < el-select v-model = "editForm.knowledgeType"><el-option label="课程知识库" value="course" /><el-option label="答疑知识库" value="qa" /><el-option label="通用知识库" value="general" / > < / el-select > < / el-form-item >
< el-form-item label = "审核方式" required > < el-select v-model = "editForm.reviewMode"><el-option label="必须人工审核发布" value="manual" /><el-option label="允许自动处理后发布" value="automatic" / > < / el-select > < / el-form-item >
< el-alert title = "本次修改不会重新同步飞书,也不会改变当前正式版本和开放状态。" type = "info" :closable = "false" / >
< / el-form >
< template # footer > < el-button @click ="editOpen = false" > 取消 < / el -button > < el-button type = "primary" :loading = "editSaving" @click ="saveMetadata" > 保存 < / el -button > < / template >
@@ -496,7 +432,6 @@ async function confirmAction(
< el-alert : title = "`已选择 ${selectedRows.length} 个知识库,未选择的字段将保持原值。`" type = "info" :closable = "false" / >
< el-form label -position = " top " class = "batch-edit-form" >
< el-form-item label = "知识库类型" > < el-select v-model = "batchForm.knowledgeType" clearable placeholder="不修改"><el-option label="课程知识库" value="course" /><el-option label="答疑知识库" value="qa" /><el-option label="通用知识库" value="general" / > < / el-select > < / el-form-item >
< el-form-item label = "审核方式" > < el-select v-model = "batchForm.reviewMode" clearable placeholder="不修改"><el-option label="必须人工审核发布" value="manual" /><el-option label="允许自动处理后发布" value="automatic" / > < / el-select > < / el-form-item >
< / el-form >
< template # footer > < el-button @click ="batchOpen = false" > 取消 < / el -button > < el-button type = "primary" :loading = "batchSaving" @click ="saveBatchMetadata" > 下一步 < / el -button > < / template >
< / el-dialog >