SideMenu.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <template>
  2. <div class="left-nav">
  3. <el-menu default-active="1-1" class="el-menu-vertical-demo">
  4. <el-sub-menu index="1">
  5. <template #title>
  6. <i class="el-icon-location"></i>
  7. <span>工作台</span>
  8. </template>
  9. <el-menu-item-group>
  10. <el-menu-item @click="router.push({ name: 'home' })" index="1-1">工作台概览</el-menu-item>
  11. </el-menu-item-group>
  12. </el-sub-menu>
  13. <el-sub-menu index="2">
  14. <template #title>
  15. <i class="el-icon-location"></i>
  16. <span>工作队列({{ queues.length }})</span>
  17. </template>
  18. <el-menu-item-group>
  19. <template v-for="(queue, index) in queues" :key="queue.id">
  20. <el-menu-item :index="'2' + '-' + index" @click="queueClicked(queue)">
  21. <!-- <template #title> -->
  22. <span>{{ queue.name }}</span>
  23. <el-tag v-if="queue.type == 'input'" effect="light" round>START</el-tag>
  24. <!-- </template> -->
  25. </el-menu-item>
  26. </template>
  27. </el-menu-item-group>
  28. </el-sub-menu>
  29. <el-sub-menu index="3">
  30. <template #title>
  31. <i class="el-icon-location"></i>
  32. <span>知识图谱</span>
  33. </template>
  34. <el-menu-item-group>
  35. <el-menu-item index="3-1" @click="handleMenuClick('graph')">全部图谱</el-menu-item>
  36. </el-menu-item-group>
  37. </el-sub-menu>
  38. <el-sub-menu index="4">
  39. <template #title>
  40. <i class="el-icon-location"></i>
  41. <span>工作人员({{ workers.length }})</span>
  42. </template>
  43. <el-menu-item-group>
  44. <el-menu-item v-for="worker in workers" :key="worker.id" @click="selectWorker(worker)"
  45. :index="'4-' + worker.id">
  46. <el-icon>
  47. <User />
  48. </el-icon>
  49. <span>{{ worker.name }}</span>
  50. <el-tag :type="worker.status === '空闲' ? 'success' : 'warning'" size="small">
  51. {{ worker.status }}
  52. </el-tag>
  53. </el-menu-item>
  54. </el-menu-item-group>
  55. </el-sub-menu>
  56. </el-menu>
  57. <!-- <div class="nav-section">
  58. <h3>工作台</h3>
  59. <el-menu :default-active="$route.path" router>
  60. <el-menu-item index="/home" :route="{ path: '/home' }">
  61. <template #title>
  62. <el-icon></el-icon>
  63. <span>工作台概览</span>
  64. </template>
  65. </el-menu-item>
  66. </el-menu>
  67. </div>
  68. <div class="nav-section">
  69. <h3>工作队列({{ queues.length }})</h3>
  70. <el-menu>
  71. <template v-for="queue in queues" :key="queue.id">
  72. <el-menu-item :index="'queue' + '_' + queue.id" @click="queueClicked(queue)">
  73. <template #title>
  74. <span>{{ queue.name }}</span>
  75. <el-tag v-if="queue.type == 'input'" effect="light" round>START</el-tag>
  76. </template>
  77. </el-menu-item>
  78. </template>
  79. </el-menu>
  80. </div>
  81. <div class="nav-section">
  82. <h3>知识图谱</h3>
  83. <el-menu>
  84. <el-menu-item @click="handleMenuClick('graph')">
  85. <span>全部图谱</span>
  86. </el-menu-item>
  87. </el-menu>
  88. </div>
  89. <div class="nav-section">
  90. <h3>工作人员({{ workers.length }})</h3>
  91. <el-menu>
  92. <el-menu-item v-for="worker in workers" :key="worker.id" @click="selectWorker(worker)">
  93. <el-icon>
  94. <User />
  95. </el-icon>
  96. <span>{{ worker.name }}</span>
  97. <el-tag :type="worker.status === '空闲' ? 'success' : 'warning'" size="small">
  98. {{ worker.status }}
  99. </el-tag>
  100. </el-menu-item>
  101. </el-menu>
  102. </div> -->
  103. <!-- <div class="nav-section">
  104. <h3>知识库管理平台</h3>
  105. <el-menu>
  106. <el-menu-item @click="router.push({ name: 'kmplatform' })">
  107. <span>知识库管理</span>
  108. </el-menu-item>
  109. </el-menu>
  110. </div> -->
  111. </div>
  112. </template>
  113. <script setup lang="ts">
  114. import { ref, onMounted } from 'vue'
  115. import { useRouter } from 'vue-router'
  116. import { User } from '@element-plus/icons-vue'
  117. import type { WorkQueue, Worker } from '../libs/dataset.ts'
  118. const router = useRouter();
  119. const emit = defineEmits(['selectQueue', 'selectWorker', 'selectMenu']);
  120. // 模拟数据
  121. const queues = [
  122. {
  123. id: 0,
  124. name: "全部工作",
  125. taskCount: 1,
  126. tasks: []
  127. },
  128. {
  129. id: 6,
  130. name: "WORD文档抽取",
  131. taskCount: 1,
  132. tasks: [],
  133. type: "input"
  134. },
  135. {
  136. id: 1,
  137. name: "PDF文档抽取",
  138. taskCount: 1,
  139. tasks: [],
  140. type: "input"
  141. },
  142. // {
  143. // id: 2,
  144. // name: "文本校对",
  145. // taskCount: 1,
  146. // tasks: []
  147. // },
  148. {
  149. id: 3,
  150. name: "文本切片队列",
  151. taskCount: 1,
  152. tasks: []
  153. },
  154. {
  155. id: 4,
  156. name: "知识抽取",
  157. taskCount: 1,
  158. tasks: []
  159. },
  160. {
  161. id: 5,
  162. name: "知识图谱构建",
  163. taskCount: 1,
  164. tasks: []
  165. },
  166. ]
  167. const workers = ref<Worker[]>(Array.from({ length: 2 }, (_, i) => ({
  168. id: i + 1,
  169. name: `后台服务 ${i + 1}`,
  170. status: Math.random() > 0.5 ? '忙碌' : '空闲'
  171. })))
  172. const selectedQueue = ref(null)
  173. const selectedWorker = ref<Worker | null>(null)
  174. const queueClicked = (queue: any) => {
  175. selectedQueue.value = queue;
  176. selectedWorker.value = null;
  177. emit('selectQueue', { id: queue.id });
  178. }
  179. const handleMenuClick = (menu: string) => {
  180. console.log("handleMenuClick called with menu:", menu); // 调试输出
  181. emit('selectMenu', { name: menu });
  182. }
  183. const selectWorker = (worker: Worker) => {
  184. selectedWorker.value = worker
  185. selectedQueue.value = null
  186. }
  187. </script>
  188. <style scoped lang="less">
  189. .left-nav {
  190. // width: 280px;
  191. height: 100vh;
  192. // border-right: 0px solid #e4e7ed;
  193. // padding: 20px;
  194. // overflow: auto;
  195. // overflow-y: auto;
  196. // background-color: #e4e7ed;
  197. // background-color: #d5e9fe;
  198. .nav-section {
  199. margin-bottom: 30px;
  200. h3 {
  201. margin-bottom: 15px;
  202. color: #666;
  203. }
  204. }
  205. }
  206. .el-menu-vertical-demo {
  207. height: 100%;
  208. }
  209. </style>