feat: 侧边栏单独模块下使用公共

This commit is contained in:
gaofeihang committed 2025-09-18 00:03:54 +08:00
1 parent f22333f6f5
commit 4f5a69265d
3 files changed
+165

No files matched your search

+108
View File
@@ -0,0 +1,108 @@
<template>
<div class="equipment-bar" v-if="!isCollapsed">
<img src="@/assets/images/equipment/侧边导航栏.png" alt="" />
<div class="equipment-item">
<div v-for="(item, index) in menuItems" :key="index" class="" @click="selectItem(index)">
<div class="menu-icon">
<img v-if="activeIndex === index" src="@/assets/images/equipment/选中按钮.png" alt="" />
<img
:src="activeIndex === index ? item.activeIcon : item.inactiveIcon"
:alt="item.title"
/>
</div>
</div>
</div>
</div>
<div
style="cursor: pointer"
:class="isCollapsed ? 'equipment-arrow-left' : 'equipment-arrow-right'"
@click="isCollapsed = !isCollapsed"
>
<img :src="isCollapsed ? arrowright : arrowleft" alt="" />
</div>
</template>
<script lang="ts" setup>
import { ref, withDefaults, defineProps, defineEmits } from 'vue'
import arrowleft from '@/assets/images/equipment/按钮-收缩.png'
import arrowright from '@/assets/images/equipment/按钮-展开.png'
// 定义菜单项接口
export interface MenuItem {
activeIcon: string // 高亮状态图标路径
inactiveIcon: string // 非高亮状态图标路径
title: string // 菜单项标题
}
// 定义组件属性
interface Props {
menuItems: MenuItem[] // 菜单项数组
defaultActive?: number // 默认选中项索引
collapseIcon?: string // 折叠图标
expandIcon?: string // 展开图标
}
// 设置默认属性
const props = withDefaults(defineProps<Props>(), {
defaultActive: 0
})
// 定义事件
const emit = defineEmits<{
(e: 'item-selected', index: number): void
(e: 'toggle', collapsed: boolean): void
}>()
const isCollapsed = ref(false)
// 当前选中项索引
const activeIndex = ref(props.defaultActive)
// 是否折叠
const collapsed = ref(false)
// 选择菜单项
const selectItem = (index: number) => {
activeIndex.value = index
emit('item-selected', index)
}
// 切换折叠状态
const toggleCollapse = () => {
collapsed.value = !collapsed.value
}
</script>
<style lang="less">
.equipment-item {
position: absolute;
top: 0;
left: 0;
}
.equipment-arrow-left {
position: absolute;
top: 490px;
left: -41px;
width: 150px;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.equipment-arrow-right {
position: absolute;
top: 490px;
left: 268px;
width: 150px;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.menu-icon {
display: flex;
// justify-content: space-between;
}
</style>
+8
View File
@@ -76,6 +76,14 @@ const routes: RouteRecordRaw[] = [
meta: { meta: {
title: '脚本准备' title: '脚本准备'
} }
},
{
path: '/preparedetail',
name: 'Preparedetail',
component: () => import('@/views/preparedetail/index.vue'),
meta: {
title: '脚本准备详情'
}
} }
] ]
+49
View File
@@ -0,0 +1,49 @@
<template>
<div
class="absolute inset-0 bg-cover bg-center bg-no-repeat equipment-bg"
:style="{ backgroundImage: getBackgroundImage(IMAGE_PATHS.EQUIPMENT.BG) }"
>
<Sidebar
:menu-items="menuItems"
:default-active="defaultActive"
@item-selected="handleMenuItemSelected"
@toggle="handleSidebarToggle"
/>
</div>
</template>
<script setup lang="tsx">
import { ref, reactive, onMounted } from 'vue'
import Sidebar from '@/components/Sidebar/Sidebar.vue'
import { getBackgroundImage, IMAGE_PATHS } from '@/utils'
import equipmentPhone from '@/assets/images/equipment/手机-亮.png'
import equipmentPhone2 from '@/assets/images/equipment/手机-暗.png'
const menuItems = ref([
{
activeIcon: equipmentPhone,
inactiveIcon: equipmentPhone2,
title: '手机'
},
{
activeIcon: equipmentPhone,
inactiveIcon: equipmentPhone2,
title: '手机2'
},
{
activeIcon: equipmentPhone,
inactiveIcon: equipmentPhone2,
title: '手机3'
}
])
const defaultActive = ref(0)
const handleMenuItemSelected = (index: number) => {
defaultActive.value = index
console.log('选中了菜单项:', index)
// 根据选中的菜单项更新页面内容
}
const handleSidebarToggle = (collapsed: boolean) => {
console.log('侧边栏状态:', collapsed ? '已折叠' : '已展开')
}
</script>
<style scoped lang="less"></style>