Vue e e-commerce project exercise-3 home page design

Realization effect

Design ideas

It is mainly divided into three parts

  • Head area
  • Sidebar area
  • Right body area

Use the Container layout Container to build the basic structure of the page container

 <el-container>: Outer container. When a child element contains <el-header> or <el-footer>When, all child elements will be arranged vertically up and down, otherwise they will be arranged horizontally left and right.
 <el-header>: Top bar container.
 <el-aside>: Sidebar container.
  <el-main>: Main area containers.
  <el-footer>: Bottom bar container.

Concrete implementation

Build basic structure

Select the fourth one and stick it to home Vue

<el-container>
  <!-- Head area -->
  <el-header>
  	Header
  	<el-button type="info" @click="logout">sign out</el-button>
  </el-header>
  
  <!-- Content body area -->
  <el-container>
    <!-- sidebar  -->
    <el-aside width="200px">Aside</el-aside>
    <!-- Right content body area -->
    <el-main>Main</el-main>
  </el-container>
</el-container>

The name of the component provided in the element ui is the class name, which can be directly used to select and add styles

Add a style to them: background color to fill the whole screen [add a class name to the outermost El container and set height: 100%]

header area design

It is divided into icon, text and button on the right

    <!-- Head area -->
    <el-header>
      <div>
        <img src="../assets/touxiang.jpg" />
        <span>E-commerce management system</span>
      </div>
      <el-button type="info" @click="logout">sign out</el-button>
    </el-header>

flex layout

.el-header {
  background-color: #373d41;
  display: flex;  
  justify-content: space-between; // Align left and right trim
  align-items: center;  // Center button
  > div {
    display: flex;  
    align-items: center;  // Center text vertically
    img {
      width: 60px;
      border-radius: 50%;
    }
    span {
      color: white;
      font-size: 18px;
      margin-left: 15px;
    }
  }
}

Side bar design

The menu is divided into two levels, which can be folded and used with El menu menu

Examples of using custom colors

      <!-- sidebar  -->
      <el-aside width="200px">
      
      	<!-- Sidebar menu area -->
        <el-menu background-color="#333744" text-color="#fff" active-text-color="#409eff">
        
          <!-- First level menu -->
          <el-submenu index="1">
            <!-- First level menu template area -->
            <template slot="title">
              <!-- Icon -->
              <i :class="el-icon-location"></i>
              <!-- text -->
              <span>Navigation one</span>
            </template>
            
            <!-- Secondary menu -->
            <!-- router Turn on routing mode, index As jump address -->
            <el-menu-item index="1-1">
              <template slot="title">
                <!-- Icon -->
                <i class="el-icon-menu"></i>
                <!-- text -->
                <span>Navigation 1-1</span>
              </template>
            </el-menu-item>
            
          </el-submenu>
          
        </el-menu>
      </el-aside>
.el-aside {
  background-color: #333744;
  .el-menu {
    border-right: 0;   // Menu right border line

  }
}

Add token authentication through axios

Note: for API s requiring Authorization, you must provide a token token using the Authorization field in the request header

In main JS

// Add token authentication through axios interceptor
axios.interceptors.request.use(config => {
  config.headers.Authorization = window.sessionStorage.getItem('token')
  // Finally, you must add a return
  return config
})

Dynamically obtain sidebar menu data through the interface

get data

You should get the menu data as soon as the page starts loading

  data() {
    return {
      menulist: []
    };
  },
  
  created() {
    this.getMenuList()
  },
    getMenuList() {
      // Get all menu names
      this.$http.get('menus').then((res) => {
        console.log(res);
        if (res.data.meta.status == 200) {
          this.menulist = res.data.data
          console.log(this.menulist);
        } else {
          return this.$message.error(res.data.meta.msg)
        }
      });
    },

v-for rendering data and icons

data type

  • Specify a unique index for each El submenu to control that it will not be opened when opening one. Dynamic data binding
  • index should be in string format, item ID is a numeric type. To convert, splice an empty string: it is a dynamic binding
  • authName is the text area of the first level menu
  • id is the key in v-for
  • The secondary menu loops through the children
  • Secondary icons use "El icon menu"
  • Level 1 Icon defines an icon object in data, with id as key and icon as value
  • Active text color = "#409eff" sets the color highlighted when selected
  • The unique opened setting opens only one menu bar at a time
      <!-- sidebar  -->
      <el-aside width="200px">
      
      	<!-- Sidebar menu area -->
        <el-menu background-color="#333744" text-color="#fff" active-text-color="#409eff" unique-opened>
        
          <!-- First level menu -->
          <el-submenu :index="item.id + ''" v-for="item in menulist" :key="item.id">
            <!-- First level menu template area -->
            <template slot="title">
              <!-- Icon -->
              <i :class="iconObj[item.id]"></i>
              <!-- text -->
              <span>{{item.authName}}</span>
            </template>
            
            <!-- Secondary menu -->
            <!-- router Turn on routing mode, index As jump address -->
            <el-menu-item :index="subItem.id + ''" v-for="subItem in item.children" :key="subItem.id">
              <template slot="title">
                <!-- Icon -->
                <i class="el-icon-menu"></i>
                <!-- text -->
                <span>{{subItem.authName}}</span>
              </template>
            </el-menu-item>
            
          </el-submenu>
          
        </el-menu>
      </el-aside>
<script>
export default {
  data() {
    return {
      menulist: [],
      iconObj: {
        "125": "el-icon-user-solid",
        "103": "el-icon-lock",
        "101": "el-icon-s-goods",
        "102": "el-icon-s-order",
        "145": "el-icon-s-data"
      }
    };
  },

Set that only one menu bar can be opened at a time

Sidebar collapse and expand

  • Place sidebar objects and div labels|||
  • Set style
  • The collapse property controls the collapse and expansion state
  • The collapse transition property controls the collapse animation to be turned off
  • Define the control variable isCollapse in data
  • Set click trigger method
  • The sidebar width is dynamically assigned according to isCollapse
    <el-container>
      <!-- sidebar  -->
      <el-aside :width="isCollapse ? '64px' : '200px'">
        <div class="toggle-button" @click="toggleCollapse">|||</div>
        <el-menu 
	        background-color="#333744" 
	        text-color="#fff" 
	        active-text-color="#409eff" 
	        unique-opened  
	        :collapse="isCollapse" 
	        :collapse-transition="false">
.toggle-button {
  font-size: 10px;
  line-height: 24px;
  color: #fff;
  text-align: center;
  letter-spacing: 0.2em;  // Spacing between three vertical lines
  cursor: pointer;  // Put the mouse up into the shape of a small hand
}
  data() {
    return {
      menulist: [],
      iconObj: {
        "125": "el-icon-user-solid",
        "103": "el-icon-lock",
        "101": "el-icon-s-goods",
        "102": "el-icon-s-order",
        "145": "el-icon-s-data"
      },
      isCollapse: false
    };
  },
    toggleCollapse() {
      // Click the button to switch the collapse and expansion of the menu
      this.isCollapse = !this.isCollapse;
    }

Sidebar routing link transformation

  1. Turn on the routing mode and add a router attribute in the El menu
  2. The jump defaults to the location corresponding to the index, so change the index to the path attribute in the data
        <el-menu background-color="#333744" text-color="#fff" active-text-color="#409eff" 
        unique-opened :collapse="isCollapse" :collapse-transition="false" router>
            <!-- Secondary menu -->
            <!-- router Turn on routing mode, index As jump address -->
            <el-menu-item :index="'/'+subItem.path" v-for="subItem in item.children" :key="subItem.id">

Home page routing redirection

  1. Define welcome components
  2. At home Place a route placeholder in the main section of Vue
  3. Set the welcome component as the sub route of Home
<template>
  <div>
      <h3>welcome</h3>
  </div>
</template>

<script>
export default {
  data() {
    return {

    }
  },
  components: {

  }
}
</script>

<style lang="less" scoped>

</style>
      <!-- Right content body area -->
      <el-main>
        <!-- Route placeholder -->
        <router-view></router-view>
      </el-main>
const router = new Router({
  routes: [
    { path: '/', redirect: '/login' },
    { path: '/login', component: Login },
    {
      path: '/home',
      component: Home,
      redirect: '/welcome',
      children: [
        { path: '/welcome', component: Welcome }, 

Keywords: Front-end Vue elementUI

Added by Stickdragon on Mon, 03 Jan 2022 07:10:04 +0200