App.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <n-config-provider preflight-style-disabled inline-theme-disabled>
  3. <div class="box">
  4. <Head v-model:show-add="showAdd" v-model:list="tabs" :select-tab="selectKey" @on-change="onChange" />
  5. <div class="box-content">
  6. <component :is="currentCom.sshCom" />
  7. </div>
  8. </div>
  9. <!-- 弹窗 -->
  10. <n-modal v-model:show="showAdd">
  11. <Add @call-back="addBack" />
  12. </n-modal>
  13. </n-config-provider>
  14. </template>
  15. <script setup lang='ts'>
  16. import {
  17. defineAsyncComponent, onMounted, ref, shallowRef
  18. } from 'vue'
  19. import Head from '@/components/head.vue'
  20. import Add from '@/components/add.vue'
  21. import { FormData } from '@/components/edit.vue'
  22. // TODO 每个tab都会存储相应组件用户操作过的数据
  23. const showAdd = ref(false)
  24. const tabs = shallowRef([
  25. {
  26. label: 'Home',
  27. icon: 'home',
  28. size: 14,
  29. sshCom: defineAsyncComponent(() => import('@/components/ssh.vue')),
  30. sftpCom: undefined
  31. }
  32. ] as FormData[])
  33. const selectKey = ref(0)
  34. const currentCom = shallowRef(tabs.value[selectKey.value])
  35. function addBack(params: FormData) {
  36. tabs.value.push({
  37. ...params,
  38. icon: 'cmd',
  39. size: 13,
  40. sshCom: defineAsyncComponent(() => import('@/components/ssh.vue')),
  41. sftpCom: undefined
  42. })
  43. selectKey.value = tabs.value.length - 1
  44. currentCom.value = tabs.value[selectKey.value]
  45. showAdd.value = false
  46. }
  47. function onChange(params: { id: number, type: string }) {
  48. const { id, type } = params
  49. if (type === 'del' && id !== 0) tabs.value.splice(id, 1)
  50. selectKey.value = type === 'change' ? id : id - 1
  51. currentCom.value = tabs.value[selectKey.value]
  52. }
  53. onMounted(() => {
  54. window.$electron.send('close-loading')
  55. })
  56. </script>
  57. <style lang="scss" scoped>
  58. .box {
  59. width: 100vw;
  60. height: 100vh;
  61. &-content {
  62. height: calc(100% - 38px);
  63. width: 100%;
  64. border-top: solid 3px white;
  65. }
  66. }
  67. </style>