主要变更: 1. 重构API目录结构,采用模块化设计,适配5.x后端接口规范 2. 优化布局组件,提升用户界面体验 3. 增强国际化支持,完善多语言配置 4. 新增权限控制功能,支持前端路由权限管理 5. 优化认证流程,支持JWT认证机制 6. 新增中间件和插件,提升系统扩展性 7. 优化状态管理,采用更清晰的模块化设计 8. 新增搜索框、广告等组件,丰富页面功能 9. 更改包管理工具从npm到pnpm,提升依赖管理效率 10. 完善配置系统,支持多环境配置 适配5.x后端特性: - 采用新的API接口规范 - 支持JWT认证机制 - 适配后端权限控制体系 - 支持后端国际化接口 - 优化数据交互方式
122 lines
2.5 KiB
Vue
122 lines
2.5 KiB
Vue
<template>
|
|
<el-drawer
|
|
class="ma-aside-drawer"
|
|
:append-to-body="true"
|
|
v-model="drawerVisible"
|
|
:with-header="false"
|
|
direction="ltr"
|
|
:size="'50%'"
|
|
>
|
|
<div class="drawer-header">
|
|
<Logo clickable show-text size="small" />
|
|
<div @click="closeDrawer" class="drawer-close">
|
|
<Icon icon="ant-design:close-outlined" color="var(--el-color-primary)" size="20" />
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 移动端菜单 -->
|
|
<div class="mobile-menu-section">
|
|
<Menu :show-icon="true" mode="vertical" @menu-click="closeDrawer" />
|
|
</div>
|
|
|
|
<!-- 移动端-会员菜单 -->
|
|
<div class="mobile-menu-section">
|
|
<HeaderActions :show-icon="true" mode="vertical" @menu-click="closeDrawer" />
|
|
</div>
|
|
</el-drawer>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import Menu from './menu.vue'
|
|
import Logo from './logo.vue'
|
|
import HeaderActions from './header-actions.vue'
|
|
import { Icon } from '~/components/icon'
|
|
|
|
interface Props {
|
|
modelValue: boolean
|
|
}
|
|
|
|
const props = defineProps<Props>()
|
|
const emit = defineEmits<{
|
|
'update:modelValue': [value: boolean]
|
|
languageChanged: [languageName: string]
|
|
loggedOut: []
|
|
}>()
|
|
|
|
const drawerVisible = computed({
|
|
get: () => props.modelValue,
|
|
set: (value) => emit('update:modelValue', value)
|
|
})
|
|
|
|
const closeDrawer = () => {
|
|
drawerVisible.value = false
|
|
}
|
|
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.drawer-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 15px 20px;
|
|
background-color: var(--el-color-info-light-9);
|
|
border-bottom: 1px solid var(--el-border-color-light);
|
|
|
|
.drawer-close {
|
|
cursor: pointer;
|
|
padding: 8px;
|
|
border-radius: 4px;
|
|
|
|
&:hover {
|
|
background-color: var(--el-fill-color-light);
|
|
}
|
|
}
|
|
}
|
|
|
|
.mobile-menu-section {
|
|
flex: 1;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.mobile-actions {
|
|
padding: 20px;
|
|
border-top: 1px solid var(--el-border-color-light);
|
|
background-color: var(--el-fill-color-light);
|
|
}
|
|
|
|
.mobile-action-section {
|
|
margin-bottom: 20px;
|
|
|
|
&:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
}
|
|
|
|
.mobile-action-title {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
margin-bottom: 10px;
|
|
font-weight: 600;
|
|
padding: 10px 16px;
|
|
color: var(--el-text-color-primary);
|
|
}
|
|
|
|
.theme-toggle-mobile {
|
|
padding: 10px 10px;
|
|
}
|
|
|
|
// 暗黑模式适配
|
|
@at-root html.dark {
|
|
.drawer-header {
|
|
background-color: var(--el-bg-color-page);
|
|
}
|
|
|
|
.mobile-actions {
|
|
border-top-color: var(--el-border-color);
|
|
background-color: var(--el-fill-color-dark);
|
|
}
|
|
}
|
|
</style>
|