index.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <template>
  2. <div class="flex h-full w-full">
  3. <div class="mr-[1rem] w-[13rem]">
  4. <div class="menu-title">
  5. <span v-title>{{ state.knowledge?.name }}</span>
  6. </div>
  7. <template v-for="(item, index) in menus">
  8. <div
  9. class="w-full bg-[#ffffff] p-[var(--czr-gap)] last:rounded-b-[0.5rem]"
  10. >
  11. <div
  12. class="menu-item __hover"
  13. :class="{ active: state.menu === item.value }"
  14. @click="
  15. () => {
  16. state.menu = item.value
  17. $router.replace({
  18. name: '78430247-a531-4c8f-8a08-c88e93a836e2',
  19. query: { menu: item.value },
  20. })
  21. }
  22. "
  23. >
  24. <SvgIcon :name="item.icon" :active="state.menu === item.value" />
  25. {{ item.label }}
  26. </div>
  27. </div>
  28. </template>
  29. </div>
  30. <component
  31. v-if="state.knowledge.ID"
  32. :is="menus.filter((v) => v.value === state.menu)[0]?.com"
  33. :knowledge="state.knowledge"
  34. />
  35. </div>
  36. </template>
  37. <script setup lang="ts">
  38. import {
  39. defineAsyncComponent,
  40. getCurrentInstance,
  41. onMounted,
  42. provide,
  43. reactive,
  44. ref,
  45. } from 'vue'
  46. import { useRoute, useRouter } from 'vue-router'
  47. import { datasetsDetail } from '@/api/modules/knowledge'
  48. import { ElMessage } from 'element-plus'
  49. const route = useRoute()
  50. const router = useRouter()
  51. const emit = defineEmits([])
  52. const props = defineProps({})
  53. const { proxy }: any = getCurrentInstance()
  54. const menus = [
  55. {
  56. label: '文档',
  57. value: 'document',
  58. icon: 'document',
  59. com: defineAsyncComponent(() => import('./document/index.vue')),
  60. },
  61. {
  62. label: '问答',
  63. value: 'qa',
  64. icon: 'qa',
  65. com: defineAsyncComponent(() => import('./qa/index.vue')),
  66. },
  67. {
  68. label: '召回测试',
  69. value: 'test',
  70. icon: 'back_1',
  71. com: defineAsyncComponent(() => import('./test/index.vue')),
  72. },
  73. // { label: '设置', value: 'config', icon: 'config' },
  74. ]
  75. const state: any = reactive({
  76. ID: route.params.id,
  77. knowledge: {},
  78. menu: null,
  79. })
  80. provide('ID', state.ID)
  81. const initDetail = () => {
  82. if (state.ID) {
  83. const m = route.query.menu
  84. if (m && menus.some((v) => v.value === m)) {
  85. state.menu = m
  86. } else {
  87. state.menu = menus[0].value
  88. }
  89. datasetsDetail(state.ID)
  90. .then(({ data }: any) => {
  91. state.knowledge = {
  92. ...data,
  93. ID: data.id,
  94. }
  95. })
  96. .catch(() => {})
  97. } else {
  98. router.push({ name: '4342bfff-1ea8-4f4c-b562-3cdc1fde116f' })
  99. }
  100. }
  101. onMounted(() => {
  102. initDetail()
  103. })
  104. </script>
  105. <style lang="scss" scoped>
  106. .menu-title {
  107. width: 13rem;
  108. height: 2.88rem;
  109. background-image: url('@/assets/images/knowledge-document-menu.png');
  110. background-size: 100% 100%;
  111. background-repeat: no-repeat;
  112. border-radius: 0.5rem 0.5rem 0 0;
  113. font-weight: bold;
  114. font-size: 1rem;
  115. color: #303133;
  116. display: flex;
  117. align-items: center;
  118. padding: 0 var(--czr-gap);
  119. }
  120. .menu-item {
  121. width: 100%;
  122. height: 2.25rem;
  123. display: flex;
  124. align-items: center;
  125. font-size: 0.88rem;
  126. padding: 0 var(--czr-gap);
  127. color: #606266;
  128. border-radius: 0.25rem;
  129. .svg-icon {
  130. margin-right: 1rem;
  131. }
  132. &.active {
  133. color: var(--czr-main-color);
  134. background-color: rgba(var(--czr-main-color-rgb), 0.1);
  135. }
  136. }
  137. </style>