default-layout.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <template>
  2. <a-layout class="layout">
  3. <a-layout-header class="layout-navbar">
  4. <Navbar />
  5. </a-layout-header>
  6. <a-layout>
  7. <a-layout-sider class="layout-sider">
  8. <Menu class="menu-wrapper" />
  9. </a-layout-sider>
  10. <a-layout-content class="layout-content">
  11. <PageLayout style="margin-bottom: 30px;" />
  12. <Footer />
  13. </a-layout-content>
  14. </a-layout>
  15. <!-- <a-avatar class="aiButton" @click="chat = !chat">
  16. <img alt="avatar" src="@/assets/img/ai.png" />
  17. </a-avatar>
  18. <AIChat :visible="chat"/> -->
  19. </a-layout>
  20. </template>
  21. <script setup>
  22. import { onMounted, onBeforeUnmount, ref, onUnmounted } from 'vue'
  23. import { eventBus } from '@/utils/eventBus'
  24. import PageLayout from './page-layout.vue'
  25. import Menu from '@/components/Menu/index.vue'
  26. import Navbar from '@/components/Navbar/index.vue'
  27. import Footer from '@/components/Footer/index.vue'
  28. // import AIChat from '@/components/AIChat/index.vue'
  29. const chat = ref(false)
  30. // 按钮拖动
  31. let isDragging = false
  32. let offsetX = 0
  33. let offsetY = 0
  34. let button = null
  35. function handleMouseDown(e) {
  36. isDragging = true
  37. const rect = button.getBoundingClientRect()
  38. offsetX = e.clientX - rect.left
  39. offsetY = e.clientY - rect.top
  40. document.addEventListener('mousemove', handleMouseMove)
  41. document.addEventListener('mouseup', handleMouseUp)
  42. }
  43. function handleMouseMove(e) {
  44. if (!isDragging) return
  45. const x = e.clientX - offsetX
  46. const y = e.clientY - offsetY
  47. button.style.left = x + 'px'
  48. button.style.top = y + 'px'
  49. button.style.right = 'auto'
  50. button.style.bottom = 'auto'
  51. }
  52. function handleMouseUp() {
  53. isDragging = false
  54. document.removeEventListener('mousemove', handleMouseMove)
  55. document.removeEventListener('mouseup', handleMouseUp)
  56. }
  57. onMounted(() => {
  58. button = document.querySelector('.aiButton')
  59. if (button) {
  60. button.addEventListener('mousedown', handleMouseDown)
  61. }
  62. eventBus.on('closeAI', () => { chat.value = false })
  63. })
  64. onBeforeUnmount(() => {
  65. if (button) {
  66. button.removeEventListener('mousedown', handleMouseDown)
  67. }
  68. })
  69. onUnmounted(() => {
  70. eventBus.off('closeAI', () => { chat.value = false })
  71. })
  72. </script>
  73. <style scoped lang="less">
  74. @nav-size-height: 60px;
  75. .layout {
  76. min-width: 1280px;
  77. width: 100%;
  78. height: 100%;
  79. }
  80. .layout-navbar {
  81. position: fixed;
  82. top: 0;
  83. left: 0;
  84. z-index: 999;
  85. width: 100%;
  86. height: @nav-size-height;
  87. }
  88. .layout-sider {
  89. position: fixed;
  90. top: 0;
  91. left: 0;
  92. z-index: 99;
  93. height: 100%;
  94. transition: all 0.2s cubic-bezier(0.34, 0.69, 0.1, 1);
  95. &::after {
  96. position: absolute;
  97. top: 0;
  98. right: -1px;
  99. display: block;
  100. width: 1px;
  101. height: 100%;
  102. background-color: var(--color-border);
  103. content: '';
  104. }
  105. }
  106. .menu-wrapper {
  107. user-select: none;
  108. margin-top: 60px;
  109. overflow: auto;
  110. overflow-x: hidden;
  111. :deep(.arco-menu) {
  112. ::-webkit-scrollbar {
  113. width: 12px;
  114. height: 4px;
  115. }
  116. ::-webkit-scrollbar-thumb {
  117. border: 4px solid transparent;
  118. background-clip: padding-box;
  119. border-radius: 7px;
  120. background-color: var(--color-text-4);
  121. }
  122. ::-webkit-scrollbar-thumb:hover {
  123. background-color: var(--color-text-3);
  124. }
  125. }
  126. }
  127. .layout-content {
  128. position: absolute;
  129. top: @nav-size-height;
  130. left: 200px;
  131. width: calc(100% - 200px);
  132. min-height: calc(100% - @nav-size-height);
  133. overflow-y: auto;
  134. background-color: var(--color-fill-2);
  135. transition: padding 0.2s cubic-bezier(0.34, 0.69, 0.1, 1);
  136. }
  137. .aiButton {
  138. position: fixed;
  139. bottom: 100px;
  140. right: 60px;
  141. z-index: 200;
  142. width: 55px;
  143. height: 55px;
  144. background-color: #fff;
  145. cursor: pointer;
  146. transition: transform 0.3s ease;
  147. &:hover {
  148. transform: scale(1.15);
  149. }
  150. }
  151. </style>