通过Element开发主页导航页面——Vue项目实战(二)

一、Home页面

Container 布局容器

在这里插入图片描述

title制作

<template>
    <div>
<!--        Contriner布局容器-->
        <el-container>
            <el-header class="homeHeader">
                <div class="title">宏信本供应链管理系统</div>
                <el-dropdown class="userInfo" @command="commandHandler">
  <span class="el-dropdown-link">
    {{user.name}}<i><img :src="user.userface" alt=""></i>
  </span>
                    <el-dropdown-menu slot="dropdown">
                        <!--                        command:点击事件-->
                        <el-dropdown-item command="userinfo">个人中心</el-dropdown-item>
                        <el-dropdown-item command="setting">设置</el-dropdown-item>
                        <el-dropdown-item command="logout" divided>注销登录</el-dropdown-item>
                    </el-dropdown-menu>
                </el-dropdown>
            </el-header>
            <el-container>
                <el-aside width="200px">Aside</el-aside>
                <el-main>Main</el-main>
            </el-container>
        </el-container>
    </div>
</template>

<script>

    export default {
        name: "Home",
        data() {
            return {
                //获取用户信息
                user: JSON.parse(window.sessionStorage.getItem("user"))
            }
        },
        methods:{
            commandHandler(cmd) {
                if (cmd == 'logout') {
                    this.$confirm('此操作将注销登录, 是否继续?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(() => {
                        this.getRequest('/logout');
                        //    清空登录数据
                        window.sessionStorage.removeItem("user")
                        this.$router.replace("/");
                    }).catch(() => {
                        this.$message({
                            type: 'info',
                            message: '已取消操作'
                        });
                    });
                }
            }
        }
    }
</script>

<style scoped>

    .homeHeader {
        background-color: #049eff;
        display: flex;
        /*竖直居中*/
        align-items: center;
        justify-content: space-between;
        padding: 0px 15px;
        box-sizing: border-box;
    }

    .title {
        font-size: 30px;
        font-family: 华文行楷;
        color: #ffffff;
    }
    .homeHeader .userInfo {
        cursor: pointer;
    }
    .el-dropdown-link img{
        width: 48px;
        height: 48px;
        border-radius: 24px;
        margin-left: 8px;
    }
    .el-dropdown-link{
        /*文字居中*/
        display: flex;
        align-items: center;
    }
</style>

在这里插入图片描述

登录跳转Home页

在这里插入图片描述

//保存用户的数据
window.sessionStorage.setItem("user",JSON.stringify(resp.obj));
//页面跳转
//$router: 获取你当前vue对象中的对象(在main.js中)
//replace:不能点击home按钮(即返回上一页)
this.$router.replace('/home')

在这里插入图片描述

导航栏菜单制作

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、导航栏加载

后端返回数据格式

{
	"status": 200,
	"msg": null,
	"obj": [{
		"deleted": 0,
		"id": 2,
		"url": "/",
		"path": "/home",
		"component": "Home",
		"name": "员工资料",
		"iconCls": "fa fa-user-circle-o",
		"parentId": 1,
		"children": [{
			"deleted": 0,
			"id": 7,
			"url": null,
			"path": "/emp/basic",
			"component": "EmpBasic",
			"name": "基本资料",
			"iconCls": null,
			"parentId": 2,
			"children": null
		}]
	}]
}

前端菜单格式化

import {getRequest} from "./api";
import router from "@/router";

/**
 * 菜单格式化
 * @param router
 * @param store
 */
export const initMenu=(router,store)=> {
    //有请求数据
    if (store.state.routes.length > 0) {
        return;
    }

    getRequest("/system/config/menu").then(data=> {
        //请求到数据
        if (data.obj) {
            console.log(data.obj);
            let fmtRoutes = formatRoutes(data.obj);
            router.addRoutes(fmtRoutes);
            //初始化utils/index.js中的state.routes:[]
            store.commit('initRoutes',fmtRoutes);
            store.dispatch('connect');
        }
    })
}

export const formatRoutes=(routes)=> {
    //返回的数据
    let fmRoutes = [];
    routes.forEach(router=> {
        //批量的变量定义,赋值给router
        let {
            path,
            component,
            name,
            meta,
            iconCls,
            children
        } = router;
        //存在且为数组
        if (children && children instanceof Array) {
            children = formatRoutes(children);
        }
        let fmRouter = {
            path:path,
            name:name,
            iconCls:iconCls,
            meta:meta,
            children:children,
            //动态加载component
            component(resolve) {
                if (component.startsWith('Home')) {
                    //动态导入包(router中的index.js)
                    require(['../views/' + component + '.vue'],resolve);
                }else if (component.startsWith('Sys')) {
                    require(['../views/sys/' + component + '.vue'],resolve);
                }
            }
        }
        fmRoutes.push(fmRouter);
    })
    return fmRoutes;
}

Home菜单数据展示修改

<el-container>
                <el-aside width="200px">
                    <!-- <el-menu @select="menuClick">-->
                    <!-- unique-opened:同一时间打开一个菜单项-->
                    <el-menu router unique-opened>
                        <!--  $router.options.routes:获取index.js中的routes数组  -->
                        <!--  <el-submenu index="1" v-for="(item,index) in this.$router.options.routes" v-if="!item.hidden" :key="index">-->
                        <!--  routes指 script中的computed的routes-->
                        <el-submenu :index="index+''" v-for="(item,index) in routes" v-if="!item.hidden" :key="index">
                            <template slot="title">
                                <i style="color: #409eff;margin-right: 5px" :class="item.iconCls"></i>
                                <span>{{item.name}}</span>
                            </template>
                            <el-menu-item :index="child.path" v-for="(child,indexj) in item.children" :key="indexj">{{child.name}}</el-menu-item>
                        </el-submenu>
                    </el-menu>
                </el-aside>
                <el-main>
                    <router-view/>
                </el-main>
            </el-container>


<script>
    export default {
        computed: {
            routes() {
                //store/index.js中
                //console.log(this.$store.state.routes)
                return this.$store.state.routes;
            }
        }
    }
</script>

在这里插入图片描述
在这里插入图片描述

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
    //声明的变量
    state:{
        //路由数组,从服务器上加载下来的菜单项
        routes:[]
    },
    mutations:{
        initRoutes(state,data) {
            state.routes = data;
        }
    },
    actions:{

    }
})

在这里插入图片描述

跳转空页面创建

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加面包屑

<!--                    面包屑:图标分隔符-->
                    <el-breadcrumb separator-class="el-icon-arrow-right" v-if="this.$router.currentRoute.path != '/home'">
                        <el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
                        <el-breadcrumb-item>{{this.$router.currentRoute.name}}</el-breadcrumb-item>
                    </el-breadcrumb>
                    <div class="homeWelcome" v-if="this.$router.currentRoute.path == '/home'">
                        欢迎来到宏信本供应链管理系统!
                    </div>
                    <router-view/>

在这里插入图片描述
在这里插入图片描述


注:能力有限,还请谅解,争取早日能够写出有质量的文章!

我是皮蛋布丁,一位爱吃皮蛋的热爱运动的废铁程序猿。

在这里插入图片描述

感谢各位大佬光临寒舍~

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值