index.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <template>
  2. <div class="knowledge-management-page">
  3. <div class="header">
  4. <div class="flex items-center justify-between">
  5. <h1>{{ t('pages.knowledge.title') }}</h1>
  6. </div>
  7. <p class="subtitle">{{ t('pages.knowledge.subtitle') }}</p>
  8. </div>
  9. <div class="main-container">
  10. <KnowledgeBaseSidebar :current-base-id="currentBase?.id!" @select-base="handleSelectBase" />
  11. <div v-if="currentBase" class="content-container">
  12. <el-tabs v-model="currentModule" type="border-card">
  13. <el-tab-pane :label="t('pages.knowledge.knowledgeTab')" name="document" v-if="currentBase.type === 'document'">
  14. <DocumentManage v-if="currentModule === 'document'" :current-base="currentBase" />
  15. </el-tab-pane>
  16. <el-tab-pane :label="t('pages.knowledge.wikiTab')" name="wiki" v-if="currentBase.type === 'document'">
  17. <WikiManage v-if="currentModule === 'wiki'" :current-base="currentBase" />
  18. </el-tab-pane>
  19. <el-tab-pane :label="t('pages.knowledge.graphTab')" name="graph" v-if="currentBase.type === 'document'">
  20. <WikiGraph v-if="currentModule === 'graph'" :current-base="currentBase" />
  21. </el-tab-pane>
  22. <el-tab-pane :label="t('pages.knowledge.qaTab')" name="qa" v-if="currentBase.type === 'faq'">
  23. <QaManage v-if="currentModule === 'qa'" :current-base-id="currentBase?.id!" />
  24. </el-tab-pane>
  25. </el-tabs>
  26. </div>
  27. <el-empty v-else :description="t('pages.knowledge.selectBase')" class="empty-container" />
  28. </div>
  29. </div>
  30. </template>
  31. <script setup lang="ts">
  32. import { ref } from 'vue'
  33. import { useI18n } from '@/composables/useI18n'
  34. import DocumentManage from './DocumentManage.vue'
  35. import KnowledgeBaseSidebar from './KnowledgeBaseSidebar.vue'
  36. import QaManage from './QaManage.vue'
  37. import type { KnowledgeBaseItem } from './types'
  38. import WikiGraph from './WikiGraph.vue'
  39. import WikiManage from './WikiManage.vue'
  40. const { t } = useI18n()
  41. const currentBase = ref<KnowledgeBaseItem>()
  42. const currentModule = ref<'document' | 'qa' | 'wiki' | 'graph'>('document')
  43. function handleSelectBase(base?: KnowledgeBaseItem) {
  44. currentBase.value = base
  45. currentModule.value = base?.type === 'document' ? 'document' : 'qa'
  46. }
  47. </script>
  48. <style scoped lang="less">
  49. .knowledge-management-page {
  50. min-height: 100%;
  51. padding: 24px;
  52. // background: #f5f7fa;
  53. box-sizing: border-box;
  54. }
  55. .header {
  56. margin-bottom: 16px;
  57. h1 {
  58. margin: 0;
  59. font-size: 28px;
  60. color: var(--text-primary);
  61. }
  62. }
  63. .subtitle {
  64. margin: 6px 0 0;
  65. font-size: 14px;
  66. color: var(--text-secondary);
  67. }
  68. .main-container {
  69. display: flex;
  70. gap: 16px;
  71. align-items: stretch;
  72. min-height: calc(100vh - 108px);
  73. }
  74. .content-container {
  75. flex: 1;
  76. min-width: 0;
  77. :deep(.el-tabs) {
  78. height: 100%;
  79. border-radius: 12px;
  80. overflow: hidden;
  81. }
  82. :deep(.el-tabs__content) {
  83. min-height: calc(100vh - 250px);
  84. padding-top: 16px;
  85. background: var(--bg-base);
  86. }
  87. }
  88. .empty-container {
  89. flex: 1;
  90. display: flex;
  91. align-items: center;
  92. justify-content: center;
  93. min-height: calc(100vh - 108px);
  94. border-radius: 12px;
  95. background: var(--bg-base);
  96. }
  97. :deep(.el-tab-pane) {
  98. height: 100%;
  99. position: relative;
  100. }
  101. @media (max-width: 960px) {
  102. .main-container {
  103. flex-direction: column;
  104. }
  105. }
  106. </style>