feat: 内容管理员新增知识库管理

This commit is contained in:
王天骄
2026-06-08 17:32:19 +08:00
parent 6e6d54e614
commit ce07eff539
3 changed files with 187 additions and 1 deletions
+2 -1
View File
@@ -125,7 +125,8 @@ export const roleMenus: Record<RoleKey, MenuSection[]> = {
{ page: 'case-library', icon: Collection, title: '病例库管理' },
{ page: 'script-case', icon: Reading, title: '剧本病例' },
{ page: 'interactive-case', icon: Operation, title: '互动病例' },
{ page: 'case-review', icon: DocumentChecked, title: '病例审核' }
{ page: 'case-review', icon: DocumentChecked, title: '病例审核' },
{ page: 'knowledge-base', icon: Files, title: '知识库管理' }
]
},
{
+1
View File
@@ -19,6 +19,7 @@ const routes: RouteRecordRaw[] = [
{ path: 'institutions', name: 'Institutions', component: () => import('@/views/InstitutionsView.vue'), meta: { title: '机构管理' } },
{ path: 'users', name: 'Users', component: () => import('@/views/UsersView.vue'), meta: { title: '用户权限' } },
{ path: 'settings', name: 'Settings', component: () => import('@/views/SettingsView.vue'), meta: { title: '系统配置' } },
{ path: 'module/knowledge-base', name: 'KnowledgeBase', component: () => import('@/views/KnowledgeBaseView.vue'), meta: { title: '知识库管理' } },
{ path: 'module/:page', name: 'Module', component: () => import('@/views/ModuleView.vue'), meta: { title: '业务模块' } }
]
}
+184
View File
@@ -0,0 +1,184 @@
<template>
<div class="page-stack">
<section class="page-toolbar">
<div>
<h1>知识库管理</h1>
<p>维护病例相关指南课件和文档资料支持上传 PDF 等附件</p>
</div>
<div class="toolbar-actions">
<el-button :icon="Upload">批量上传</el-button>
<el-button :icon="Plus" type="primary" @click="openCreateDialog">新增知识库</el-button>
</div>
</section>
<section class="filter-bar">
<el-input v-model="keyword" :prefix-icon="Search" clearable placeholder="搜索知识库名称/编号" />
<el-select v-model="category" clearable placeholder="分类">
<el-option label="临床指南" value="临床指南" />
<el-option label="教学课件" value="教学课件" />
<el-option label="诊疗规范" value="诊疗规范" />
<el-option label="病例资料" value="病例资料" />
</el-select>
<el-select v-model="status" clearable placeholder="状态">
<el-option label="已发布" value="已发布" />
<el-option label="整理中" value="整理中" />
<el-option label="草稿" value="草稿" />
</el-select>
<el-button :icon="Refresh" @click="resetFilters">重置</el-button>
</section>
<section class="data-section">
<el-table :data="filteredRows" row-key="id">
<el-table-column prop="id" label="编号" width="150" />
<el-table-column prop="name" label="知识库名称" min-width="220" />
<el-table-column prop="category" label="分类" width="120" />
<el-table-column prop="owner" label="负责人" width="120" />
<el-table-column label="附件" width="150">
<template #default="{ row }">
<el-tag type="info">{{ row.fileCount }} 个文件</el-tag>
</template>
</el-table-column>
<el-table-column prop="updatedAt" label="更新时间" width="130" />
<el-table-column prop="status" label="状态" width="110">
<template #default="{ row }">
<el-tag :type="tagType(row.status)">{{ row.status }}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="180" fixed="right">
<template #default>
<el-button link type="primary">编辑</el-button>
<el-button link type="primary">预览</el-button>
<el-button link type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
</section>
<el-dialog v-model="dialogVisible" title="新增知识库" width="560px">
<el-form label-position="top">
<el-form-item label="知识库名称" required>
<el-input v-model="form.name" placeholder="例如:急诊胸痛诊疗资料库" />
</el-form-item>
<el-form-item label="分类">
<el-select v-model="form.category" placeholder="请选择分类">
<el-option label="临床指南" value="临床指南" />
<el-option label="教学课件" value="教学课件" />
<el-option label="诊疗规范" value="诊疗规范" />
<el-option label="病例资料" value="病例资料" />
</el-select>
</el-form-item>
<el-form-item label="简介">
<el-input v-model="form.description" type="textarea" :rows="3" placeholder="补充说明资料范围或适用病例" />
</el-form-item>
<el-form-item label="上传附件">
<el-upload
v-model:file-list="fileList"
drag
multiple
:auto-upload="false"
accept=".pdf,.doc,.docx,.ppt,.pptx,.txt"
>
<el-icon class="el-icon--upload"><UploadFilled /></el-icon>
<div class="el-upload__text">拖拽文件到此处或点击选择</div>
<template #tip>
<div class="el-upload__tip">支持 PDFWordPPTTXT当前为本地选择演示</div>
</template>
</el-upload>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="createKnowledgeBase">保存</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { computed, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import type { UploadUserFile } from 'element-plus'
import { Plus, Refresh, Search, Upload, UploadFilled } from '@element-plus/icons-vue'
interface KnowledgeBaseItem {
id: string
name: string
category: string
owner: string
fileCount: number
updatedAt: string
status: string
}
const keyword = ref('')
const category = ref('')
const status = ref('')
const dialogVisible = ref(false)
const fileList = ref<UploadUserFile[]>([])
const form = reactive({
name: '',
category: '临床指南',
description: ''
})
const rows = ref<KnowledgeBaseItem[]>([
{ id: 'KB-202606-001', name: '胸痛中心诊疗指南库', category: '临床指南', owner: '王内容', fileCount: 8, updatedAt: '2026-06-05', status: '已发布' },
{ id: 'KB-202606-002', name: '儿科发热问诊课件', category: '教学课件', owner: '李医生', fileCount: 5, updatedAt: '2026-06-03', status: '整理中' },
{ id: 'KB-202605-029', name: '糖尿病慢病随访规范', category: '诊疗规范', owner: '陈医生', fileCount: 12, updatedAt: '2026-05-28', status: '已发布' },
{ id: 'KB-202605-017', name: '神经内科病例资料包', category: '病例资料', owner: '王内容', fileCount: 3, updatedAt: '2026-05-21', status: '草稿' }
])
const filteredRows = computed(() =>
rows.value.filter(item => {
const matchKeyword = !keyword.value || item.name.includes(keyword.value) || item.id.includes(keyword.value)
const matchCategory = !category.value || item.category === category.value
const matchStatus = !status.value || item.status === status.value
return matchKeyword && matchCategory && matchStatus
})
)
function openCreateDialog() {
form.name = ''
form.category = '临床指南'
form.description = ''
fileList.value = []
dialogVisible.value = true
}
function createKnowledgeBase() {
if (!form.name.trim()) {
ElMessage.warning('请输入知识库名称')
return
}
rows.value.unshift({
id: createId(),
name: form.name.trim(),
category: form.category,
owner: '王内容',
fileCount: fileList.value.length,
updatedAt: new Date().toISOString().slice(0, 10),
status: fileList.value.length > 0 ? '整理中' : '草稿'
})
dialogVisible.value = false
ElMessage.success('知识库已添加')
}
function resetFilters() {
keyword.value = ''
category.value = ''
status.value = ''
}
function createId() {
const number = String(rows.value.length + 1).padStart(3, '0')
return `KB-202606-${number}`
}
function tagType(value: string) {
if (value === '已发布') return 'success'
if (value === '整理中') return 'warning'
return 'info'
}
</script>