vue3-admin商品管理后台项目(后台布局layout布局开发一)

本文档详细记录了使用Vue3和Element Plus开发商品管理后台项目的layout布局开发过程,包括container布局、header、menu和tag导航的创建,以及刷新、全屏、修改密码等功能的实现。此外,还介绍了如何封装通用弹框表单组件和使用Composition API简化代码。

今天继续进行vue3-admin商品管理后台项目开发的后台布局layout布局开发。

首先布局使用的是element plus里的container布局容器里推荐的布局方式
用于布局的容器组件,方便快速搭建页面的基本结构:

<el-container>:外层容器。 当子元素中包含 <el-header><el-footer> 时,全部子元素会垂直上下排列, 否则会水平左右排列。

<el-header>:顶栏容器。

<el-aside>:侧边栏容器。

<el-main>:主要区域容器。

<el-footer>:底栏容器。

在src文件夹下创建layout文件夹,并且在该文件夹下创建admin.vue
,然后再layout文件夹下创建components文件夹,在该文件夹下面创建FHeader.vue(头部),FMenu.vue(侧边栏),FTagList.vue(标签导航栏部分)

编辑admin.vue

<template>
    <el-container>
        <el-header>
            <f-header/>
        </el-header>
        <el-container>
            <el-aside>
                <f-menu/>
            </el-aside>
            <el-main>
                <f-tag-list/>
                <router-view></router-view>
            </el-main>
        </el-container>
    </el-container>
</template>
<!-- <el-container>:外层容器。 当子元素中包含 <el-header><el-footer> 时,全部子元素会垂直上下排列, 否则会水平左右排列。
<el-header>:顶栏容器。  
<el-aside>:侧边栏容器。 
<el-main>:主要区域容器。 
<el-footer>:底栏容器。 -->

<script setup>
import FHeader from './components/FHeader.vue'
import FMenu from './components/FMenu.vue'
import FTagList from './components/FTagList.vue'
</script>

主要是对页面的结构进行分块
然后分别编辑FHeader.vue(头部),FMenu.vue(侧边栏),FTagList.vue(标签导航栏部分),加上

<!-- 头部部分 -->
<template>
    <div>
        头部部分
    </div>
</template>

以此类推都是这样
然后编辑router文件夹下面的index.js

import {
   
    createRouter, createWebHashHistory } from 'vue-router'
import Index from '~/pages/index.vue'
import Login from '~/pages/login.vue'
import NotFound from '~/pages/404.vue'
// 引入主布局
import Admin from "~/layouts/admin.vue"

const routes = [{
   
   
    // 根路由
    path:"/",
    component:Admin,
    // 子路由
    children:[{
   
   
        path:"/",
        component:Index,
        meta:{
   
   
            title:"后台首页"
        }
    }]
},{
   
   
    // 登录路由
    path:"/login",
    component:Login,
    meta:{
   
   
        title:"登录页"
    }
},{
   
   
    //404路由 将匹配所有内容并将其放在 `$route.params.pathMatch` 下
    path: '/:pathMatch(.*)*', 
    name: 'NotFound', 
    component: NotFound
}]

const router = createRouter({
   
   
    history:createWebHashHistory(),
    routes
})
export default router

主要是改了根路由那一部分。
这样之后再运行项目登录到主页,就会发现,分块成功了
在这里插入图片描述
这样我们的初步目的就达到了。

然后我们继续进行公共头部开发-样式布局:
这里直接上写好的代码了,注释很清楚:按钮以及下拉框什么的都是从element plus里面取下来的

<!-- 头部部分 -->
<template>
    <div class="f-header">
        <span class="logo">
            <!-- logo图标 -->
            <!-- mr-1就是margin-right:0.25rem -->
            <el-icon class="mr-1"><ElemeFilled /></el-icon>
            mzldustu商城
        </span>
        <!-- 折叠图标 -->
        <el-icon class="icon-btn"><Fold /></el-icon>
        <!-- 刷新图标 -->
        <el-icon class="icon-btn"><Refresh /></el-icon>

        <!-- 等价于margin-left = auto,flex布局,垂直居中-->
        <div class="ml-auto flex justify-center">
            <!-- 全屏图标 -->
            <el-icon class="icon-btn"><FullScreen /></el-icon>
            <el-dropdown class="dropdown">
                <!-- flex布局,垂直居中 字体颜色 -->
                <span class="flex items-center text-light-50">
                <!-- 获取用户头像 头像的右外边距-->
                <el-avatar class="mr-2" :size="50" :src="$store.state.user.avatar" />
                <!-- 获取用户username -->
                {
   
   {
   
    $store.state.user.username }}
                <el-icon class="el-icon--right">
                    <arrow-down />
                </el-icon>
                </span>
                <template #dropdown>
                    <el-dropdown-menu>
                        <el-dropdown-item>修改密码</el-dropdown-item>
                        <el-dropdown-item>退出登录</el-dropdown-item>
                    </el-dropdown-menu>
                </template>
            </el-dropdown>
        </div>
    </div>
</template>

<script>

</script>

<style>
.f-header {
   
   
    /* flex布局,垂直居中,背景颜色,字体亮度,fixed,top:0 left:0 right:0 */
    @apply flex items-center bg-indigo-700 text-light-50 fixed top-0 left-0 right-0;
    height: 64px;
}

.logo {
   
   
    width: 250px;
    /* flex布局,垂直水平居中,字体大小xl,字体稍微瘦一点*/
    @apply flex justify-center items-center text-xl font-thin;
}
/* 按钮 */
.icon-btn {
   
   
    /* flex布局 水平居中 垂直居中 */
    @apply flex justify-center items-center;
    width: 42px;
    height: 64px;
    cursor: pointer;
}
/* 鼠标覆盖到按钮颜色变浅 */
.icon-btn:hover{
   
   
    @apply bg-indigo-600;
}
/* 下拉菜单 */
.f-header .dropdown {
   
   
    height: 64px;
    cursor: pointer;
    /* flex布局,垂直水平居中 左右距离 */
    @apply flex justify-center items-center mx-5;
}
</style>

然后我们继续来写刷新和全屏:
首先给那两个按钮增加一个提示,就是鼠标移上去的时候会显示这是什么功能
在这里插入图片描述
代码实现:

<!-- 刷新图标以及它的鼠标触碰提示 -->
        <el-tooltip effect="dark" content="刷新" placement="bottom">
            <!-- 刷新图标 -->
            <el-icon class="icon-btn" @click="handleRefresh"><Refresh /></el-icon>
        </el-tooltip>

全屏功能也以此类推
然后做方法功能,另外,退出登录功能也可以迁移过来了,将之前写退出登陆的所有逻辑复制过来,然后利用element下拉栏里面的@command功能绑定方法即可。
然后刷新功能就很简单:

// 刷新方法
    const handleRefresh = ()=> location.reload()

全屏功能的话,是使用vueuse里面的一个useFullscreen功能:

// 获取全屏功能里面一些方法
    //是否全屏,切换
    const {
   
    isFullscreen, toggle } = useFullscreen()

然后直接在刷新图标写上它里面提供的toggle方法即可

<!-- 全屏图标 -->
                <el-icon class="icon-btn" @click="toggle"><FullScreen /></el-icon>

然后此时就可以实现刷新和全屏功能了
在这里插入图片描述

然后我们来实现修改密码的功能:
先去看修改密码的接口,然后使用element 的抽屉组件。
先在manager.js里面写上接口方法:

// 修改密码
export function updatePassword(data){
   
   
    return axios.post("/admin/updatepassword",data)
}

直接上代码了,主要是引用的login页面的表单,不过修改成了输入旧密码,输入新密码和确认密码,修改成功后退出登录然后重新登录,如果你浏览器里的token失效了,你进行一些操作的话,会直接给你退出让你先登录。
这里直接放上代码:

<!-- 头部部分 -->
<template>
    <div class="f-header">
        <span class="logo">
            <!-- logo图标 -->
            <!-- mr-1就是margin-right:0.25rem -->
            <el-icon class="mr-1">
                <ElemeFilled />
            </el-icon>
            mzldustu商城
        </span>
        <!-- 折叠图标 -->
        <el-icon class="icon-btn">
            <Fold />
        </el-icon>

        <!-- 刷新图标以及它的鼠标触碰提示 -->
        <el-tooltip effect="dark" content="刷新" placement="bottom">
            <!-- 刷新图标 -->
            <el-icon class="icon-btn" @click="handleRefresh">
                <Refresh />
            </el-icon>
        </el-tooltip>

        <!-- 等价于margin-left = auto,flex布局,垂直居中-->
        <div class="ml-auto flex justify-center">

            <!-- 全屏图标以及它的鼠标触碰提示 -->
            <el-tooltip effect="dark" content="全屏" placement="bottom">
                <!-- 全屏图标 -->
                <el-icon class="icon-btn" @click="toggle">
                    <FullScreen />
                </el-icon>
            </el-tooltip>


            <!-- @command是element里面下拉框能触发事件回调的指令 -->
            <el-dropdown class="dropdown" @command="handleCommand">
                <!-- flex布局,垂直居中 字体颜色 -->
                <span class="flex items-center text-light-50">
                    <!-- 获取用户头像 头像的右外边距-->
                    <el-avatar class="mr-2" :size="50" :src="$store.state.user.avatar" />
                    <!-- 获取用户username -->
                    {
   
   {
   
    $store.state.user.username }}
                    <el-icon class="el-icon--right">
                        <arrow-down /
<think>好的,我需要帮助用户找到个基于Vue 3后台管理布局模板。首先,用户提到了引用内容,包括使用Vue CLI 2、Vue3+Pinia+Layout+Router实现动态路由与布局,以及用户管理页面设计。这些引用可能提供了些线索,比如动态路由、布局组件和权限管理。 接下来,我需要考虑Vue 3的常用后台模板。Element Plus和Ant Design Vue都有适用于Vue 3的版本,并且提供布局组件。另外,Vue-element-admin虽然主要是Vue 2的,但可能有Vue 3的迁移版本或类似项目。用户可能需要动态路由和权限控制,所以需要模板支持这些功能。 然后,用户的具体需求是寻找布局模板示例。应该推荐几个主流的开源项目,并说明它们的特点,比如是否包含侧边栏、顶部导航、路由配置等。同时,需要指导用户如何开始使用这些模板,比如通过GitHub克隆仓库、安装依赖、运行示例等。 还要注意用户可能对Vue不太熟悉,所以步骤要详细,但不过于复杂。另外,用户引用了动态路由和布局的实现,因此需要强调模板是否支持这些特性,比如使用Vue Router和Pinia进行状态管理。 最后,生成相关问题,帮助用户深入理解如何定制布局、添加动态路由、处理权限等。这些问题应该围绕用户可能遇到的下步挑战,比如样式定制、组件扩展和权限集成。 总结,我需要推荐几个合适的Vue 3后台模板,解释它们的特点,提供使用步骤,并链接到相关文档。同时,确保回答结构清晰,符合用户的要求。</think>### Vue3 后台管理布局模板推荐与实现步骤 根据你的需求,以下是基于Vue3后台管理布局模板实现方案,结合动态路由、权限管理和Pinia状态库的应用: --- #### **、推荐开源模板与特点** 1. **Element Plus Admin** - 官方地址:[Element Plus Admin Demo](https://element-plus.org/zh-CN/component/layout.html) - 特点:基于Element Plus UI框架,提供侧边栏、顶部导航、面包屑等布局组件,支持动态路由配置[^1]。 - 核心代码示例: ```vue <template> <el-container> <el-aside width="200px">侧边栏菜单</el-aside> <el-container> <el-header>顶部导航栏</el-header> <el-main><router-view /></el-main> </el-container> </el-container> </template> ``` 2. **Ant Design Vue Pro** - 官方地址:[Ant Design Vue Pro](https://pro.antdv.com/) - 特点:企业级中后台模板,集成权限管理、动态路由生成和Mock数据功能[^2]。 3. **Vue3-admin-template**(社区版) - GitHub地址:[vue3-admin-template](https://github.com/jzfai/vue3-admin-template) - 特点:轻量级模板,支持Pinia状态管理,内置动态路由配置示例。 --- #### **二、快速搭建基础布局** 1. **初始化项目** 使用Vite创建Vue3项目: ```bash npm create vite@latest vue3-admin --template vue-ts cd vue3-admin npm install ``` 2. **安装布局依赖** 集成Element Plus和Vue Router: ```bash npm install element-plus @element-plus/icons-vue vue-router pinia ``` 3. **定义基础布局组件** 创建`src/layouts/MainLayout.vue`: ```vue <template> <div class="layout-container"> <el-container> <!-- 侧边栏 --> <el-aside width="200px" class="sidebar"> <div class="logo">LOGO</div> <MenuComponent /> </el-aside> <!-- 主内容区 --> <el-container> <el-header class="header"> <HeaderComponent /> </el-header> <el-main> <router-view /> </el-main> </el-container> </el-container> </div> </template> ``` --- #### **三、实现动态路由与嵌套路由** 1. **路由配置文件** 在`src/router/index.ts`中定义动态路由结构: ```typescript import { createRouter, createWebHistory } from &#39;vue-router&#39; const routes = [ { path: &#39;/&#39;, component: () => import(&#39;@/layouts/MainLayout.vue&#39;), children: [ { path: &#39;/user&#39;, component: () => import(&#39;@/views/UserManage.vue&#39;) }, { path: &#39;/role&#39;, component: () => import(&#39;@/views/RoleManage.vue&#39;) } ] } ] const router = createRouter({ history: createWebHistory(), routes }) ``` 2. **嵌套路由示例(用户设置页)** 在`/user/set`路径下嵌套子页面: ```typescript { path: &#39;/user/set&#39;, component: () => import(&#39;@/views/user/SetPage.vue&#39;), children: [ { path: &#39;menu&#39;, component: () => import(&#39;@/views/user/MenuConfig.vue&#39;) } ] } ``` --- #### **四、权限控制集成** 通过路由守卫实现动态权限加载: ```typescript router.beforeEach(async (to, from, next) => { const userStore = useUserStore() if (!userStore.roles.length) { // 获取用户权限数据 await userStore.fetchPermissions() // 动态添加路由 userStore.permissionRoutes.forEach(route => router.addRoute(route)) next({ ...to, replace: true }) } else { next() } }) ``` --- #### **五、参考模板对比** | 模板名称 | UI框架 | 动态路由 | 权限管理 | 学习成本 | |-------------------|------------|---------|---------|---------| | Element Plus Admin| Element Plus| 支持 | RBAC | 低 | | Ant Design Vue Pro| Ant Design | 支持 | ABAC | 中 | | Vue3-admin-template| 原生 | 基础支持| 需扩展 | 低 | ---
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mzldustu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值