App.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <script setup lang="ts">
  2. import { RouterLink, RouterView, useRoute } from 'vue-router'
  3. import { Menu, ConfigProvider, theme } from 'ant-design-vue'
  4. import { MessageOutlined, SettingOutlined, HistoryOutlined, BookOutlined } from '@ant-design/icons-vue'
  5. import LobsterIcon from '@/assets/lobster.svg'
  6. const route = useRoute()
  7. // 龙虾红主题配置
  8. const customTheme = {
  9. token: {
  10. colorPrimary: '#ff5c5c',
  11. colorPrimaryHover: '#ff7070',
  12. colorPrimaryActive: '#e64a4a',
  13. colorPrimaryBg: 'rgba(255, 92, 92, 0.1)',
  14. colorPrimaryBgHover: 'rgba(255, 92, 92, 0.2)',
  15. },
  16. }
  17. </script>
  18. <template>
  19. <ConfigProvider :theme="{ token: customTheme.token }">
  20. <div class="app-container">
  21. <aside class="sidebar">
  22. <div class="logo">
  23. <img :src="LobsterIcon" alt="HelloClaw" class="logo-icon" />
  24. <span class="logo-text">HelloClaw</span>
  25. </div>
  26. <Menu
  27. mode="inline"
  28. :selected-keys="[route.name as string]"
  29. class="sidebar-menu"
  30. >
  31. <Menu.Item key="chat">
  32. <RouterLink to="/">
  33. <MessageOutlined />
  34. <span>聊天</span>
  35. </RouterLink>
  36. </Menu.Item>
  37. <Menu.Item key="sessions">
  38. <RouterLink to="/sessions">
  39. <HistoryOutlined />
  40. <span>会话</span>
  41. </RouterLink>
  42. </Menu.Item>
  43. <Menu.Item key="memory">
  44. <RouterLink to="/memory">
  45. <BookOutlined />
  46. <span>记忆</span>
  47. </RouterLink>
  48. </Menu.Item>
  49. <Menu.Item key="config">
  50. <RouterLink to="/config">
  51. <SettingOutlined />
  52. <span>配置</span>
  53. </RouterLink>
  54. </Menu.Item>
  55. </Menu>
  56. </aside>
  57. <main class="main-content">
  58. <RouterView />
  59. </main>
  60. </div>
  61. </ConfigProvider>
  62. </template>
  63. <style scoped>
  64. .app-container {
  65. display: flex;
  66. height: 100vh;
  67. overflow: hidden;
  68. }
  69. .sidebar {
  70. width: 220px;
  71. background-color: #fff;
  72. border-right: 1px solid #f0f0f0;
  73. flex-shrink: 0;
  74. display: flex;
  75. flex-direction: column;
  76. }
  77. .logo {
  78. padding: 20px;
  79. display: flex;
  80. align-items: center;
  81. gap: 12px;
  82. border-bottom: 1px solid #f0f0f0;
  83. }
  84. .logo-icon {
  85. width: 36px;
  86. height: 36px;
  87. }
  88. .logo-text {
  89. font-size: 18px;
  90. font-weight: 600;
  91. color: #333;
  92. }
  93. .sidebar-menu {
  94. flex: 1;
  95. border-right: none;
  96. padding-top: 8px;
  97. }
  98. .main-content {
  99. flex: 1;
  100. background-color: #f5f5f5;
  101. overflow: auto;
  102. height: 100vh;
  103. }
  104. </style>