index.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. @refresh="initDetail"
  35. />
  36. </div>
  37. </template>
  38. <script setup lang="ts">
  39. import {
  40. defineAsyncComponent,
  41. getCurrentInstance,
  42. onMounted,
  43. provide,
  44. reactive,
  45. ref,
  46. } from 'vue'
  47. import { useRoute, useRouter } from 'vue-router'
  48. import { datasetsDetail } from '@/api/modules/knowledge'
  49. import { ElMessage } from 'element-plus'
  50. const route = useRoute()
  51. const router = useRouter()
  52. const emit = defineEmits([])
  53. const props = defineProps({})
  54. const { proxy }: any = getCurrentInstance()
  55. const menus = [
  56. {
  57. label: '文档',
  58. value: 'document',
  59. icon: 'document',
  60. com: defineAsyncComponent(() => import('./document/index.vue')),
  61. },
  62. {
  63. label: '问答',
  64. value: 'qa',
  65. icon: 'qa',
  66. com: defineAsyncComponent(() => import('./qa/index.vue')),
  67. },
  68. {
  69. label: '召回测试',
  70. value: 'test',
  71. icon: 'back_1',
  72. com: defineAsyncComponent(() => import('./test/index.vue')),
  73. },
  74. {
  75. label: '设置',
  76. value: 'config',
  77. icon: 'config',
  78. com: defineAsyncComponent(() => import('./setting/index.vue')),
  79. },
  80. ]
  81. const state: any = reactive({
  82. ID: route.params.id,
  83. knowledge: {},
  84. menu: null,
  85. })
  86. provide('ID', state.ID)
  87. const initDetail = () => {
  88. console.log(123)
  89. if (state.ID) {
  90. const m = route.query.menu
  91. if (m && menus.some((v) => v.value === m)) {
  92. state.menu = m
  93. } else {
  94. state.menu = menus[0].value
  95. }
  96. datasetsDetail(state.ID)
  97. .then(({ data }: any) => {
  98. state.knowledge = {
  99. ...data,
  100. ID: data.id,
  101. }
  102. })
  103. .catch(() => {})
  104. } else {
  105. router.push({ name: '4342bfff-1ea8-4f4c-b562-3cdc1fde116f' })
  106. }
  107. }
  108. onMounted(() => {
  109. initDetail()
  110. })
  111. </script>
  112. <style lang="scss" scoped>
  113. .menu-title {
  114. width: 13rem;
  115. height: 2.88rem;
  116. background-image: url('@/assets/images/knowledge-document-menu.png');
  117. background-size: 100% 100%;
  118. background-repeat: no-repeat;
  119. border-radius: 0.5rem 0.5rem 0 0;
  120. font-weight: bold;
  121. font-size: 1rem;
  122. color: #303133;
  123. display: flex;
  124. align-items: center;
  125. padding: 0 var(--czr-gap);
  126. }
  127. .menu-item {
  128. width: 100%;
  129. height: 2.25rem;
  130. display: flex;
  131. align-items: center;
  132. font-size: 0.88rem;
  133. padding: 0 var(--czr-gap);
  134. color: #606266;
  135. border-radius: 0.25rem;
  136. .svg-icon {
  137. margin-right: 1rem;
  138. }
  139. &.active {
  140. color: var(--czr-main-color);
  141. background-color: rgba(var(--czr-main-color-rgb), 0.1);
  142. }
  143. }
  144. </style>