fix 侧边栏

This commit is contained in:
2025-12-10 18:09:11 +08:00
parent ffbdcb29c4
commit a4ef0afa5b
2 changed files with 71 additions and 14 deletions

View File

@@ -54,11 +54,19 @@
</el-form-item> </el-form-item>
<el-form-item label="是否启用" prop="is_enabled"> <el-form-item label="是否启用" prop="is_enabled">
<el-switch v-model="form.is_enabled" /> <el-switch
v-model="form.is_enabled"
:active-value="true"
:inactive-value="false"
/>
</el-form-item> </el-form-item>
<el-form-item label="是否展示" prop="is_visible"> <el-form-item label="是否展示" prop="is_visible">
<el-switch v-model="form.is_visible" /> <el-switch
v-model="form.is_visible"
:active-value="true"
:inactive-value="false"
/>
</el-form-item> </el-form-item>
</div> </div>
@@ -371,7 +379,6 @@ const form = reactive({
seo_description: '', seo_description: '',
seo_keywords: '' seo_keywords: ''
}) })
// 表单验证规则 // 表单验证规则
const rules = { const rules = {
code: [ code: [
@@ -492,13 +499,16 @@ const handleCreateMode = () => {
if (key === 'is_package') { if (key === 'is_package') {
form[key] = false form[key] = false
} else if (key === 'is_enabled' || key === 'is_visible') { } else if (key === 'is_enabled' || key === 'is_visible') {
form[key] = true // 保持默认值 true但允许用户在界面上切换
} else if (key === 'price') { // 注意:这里不强制设置,让用户可以在界面上自由切换
// 默认值已经在 form 初始化时设置为 true第375-376行
} else if (key === 'price' || key === 'cost_price') {
form[key] = 0 form[key] = 0
} else { } else {
form[key] = '' form[key] = ''
} }
}) })
console.log('form', form)
} }
// 处理组合包数据 // 处理组合包数据
@@ -746,6 +756,10 @@ const handleSubmit = async () => {
submitting.value = true submitting.value = true
const submitData = { ...form } const submitData = { ...form }
// 确保布尔值正确传递
submitData.is_enabled = Boolean(form.is_enabled)
submitData.is_visible = Boolean(form.is_visible)
if (isEdit.value) { if (isEdit.value) {
// 编辑模式 // 编辑模式

View File

@@ -34,6 +34,7 @@
<script setup> <script setup>
import { useAppStore } from '@/stores/app' import { useAppStore } from '@/stores/app'
import { useUserStore } from '@/stores/user' import { useUserStore } from '@/stores/user'
import { onMounted, onUnmounted, watch } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
const props = defineProps({ const props = defineProps({
@@ -51,6 +52,7 @@ const props = defineProps({
const appStore = useAppStore() const appStore = useAppStore()
const userStore = useUserStore() const userStore = useUserStore()
const router = useRouter() const router = useRouter()
let bodyLockClassApplied = false
// 使用ref来控制菜单展开状态 // 使用ref来控制菜单展开状态
const openeds = ref([]) const openeds = ref([])
@@ -117,6 +119,36 @@ const handleMenuSelect = () => {
appStore.closeMobileSidebar() appStore.closeMobileSidebar()
} }
} }
// 当移动端侧边栏打开时,锁定页面点击与滚动,确保其他区域点击无效
const toggleBodyLock = (locked) => {
const body = document.body
if (locked) {
if (!bodyLockClassApplied) {
body.classList.add('sidebar-locked')
bodyLockClassApplied = true
}
} else if (bodyLockClassApplied) {
body.classList.remove('sidebar-locked')
bodyLockClassApplied = false
}
}
onMounted(() => {
toggleBodyLock(appStore.isMobile && appStore.mobileSidebarOpen)
})
onUnmounted(() => {
toggleBodyLock(false)
})
watch(
() => [appStore.isMobile, appStore.mobileSidebarOpen],
([isMobile, open]) => {
toggleBodyLock(isMobile && open)
},
{ immediate: true }
)
</script> </script>
<style scoped> <style scoped>
@@ -133,6 +165,7 @@ const handleMenuSelect = () => {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
position: relative; position: relative;
width: 100%;
z-index: 1001; z-index: 1001;
} }
@@ -142,10 +175,7 @@ const handleMenuSelect = () => {
flex: 1 1 0%; flex: 1 1 0%;
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
} width: 100%;
.sidebar-menu:not(.el-menu--collapse) {
width: 240px;
} }
.menu-item { .menu-item {
@@ -220,20 +250,21 @@ const handleMenuSelect = () => {
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
background-color: rgba(0, 0, 0, 0.5); background-color: rgba(255, 255, 255, 0.65); /* 保持浅色,不要黑色遮罩 */
backdrop-filter: blur(2px);
z-index: 999; z-index: 999;
} }
/* 响应式设计 */ /* 响应式设计 */
@media (max-width: 768px) { @media (max-width: 768px) {
.sidebar-menu:not(.el-menu--collapse) { .sidebar-menu {
width: 240px; width: 100%;
} }
} }
@media (max-width: 480px) { @media (max-width: 480px) {
.sidebar-menu:not(.el-menu--collapse) { .sidebar-menu {
width: 200px; width: 100%;
} }
.menu-item { .menu-item {
@@ -252,6 +283,18 @@ const handleMenuSelect = () => {
} }
} }
:global(body.sidebar-locked) {
overflow: hidden;
}
:global(body.sidebar-locked #app) {
pointer-events: none;
}
:global(body.sidebar-locked .app-sidebar) {
pointer-events: auto;
}
/* Element Plus 菜单样式覆盖 */ /* Element Plus 菜单样式覆盖 */
:deep(.el-menu) { :deep(.el-menu) {
background-color: transparent; background-color: transparent;