Dynamic Tree + Data Table Paging for SPA Project Development

Keywords: Front-end Vue axios Database Attribute

Article directory

Dynamic Tree and tab Page

Let's go on with our last blog and continue with the transformation.

First, we need to realize the dynamic display of the left-sidebar menu.

Design of Database Menu Table

Don't say much, just go to the code.

LeftNav.vue

<template>
  <el-menu   router :default-active="$route.path" class="el-menu-vertical-demo" background-color="#334157" text-color="#fff"
    active-text-color="#ffd04b" :collapse="collapsed">
    <!-- <el-menu default-active="2" :collapse="collapsed" collapse-transition router :default-active="$route.path" unique-opened class="el-menu-vertical-demo" background-color="#334157" text-color="#fff" active-text-color="#ffd04b"> -->
    <div class="logobox">
      <img class="logoimg" src="../assets/img/logo.png" alt="">
    </div>
    <!-- Be careful: index Is mandatory attribute 1.index Can be regarded as id,That is to say, it is the only hopping path that represents the route.-->
    <el-submenu :index=" 'id_'+m.treeNodeId" v-for="m in menus">
      <template slot="title">
        <i class="m.icon"></i>
        <span>{{m.treeNodeName}}</span>
      </template>
      <el-menu-item :key=" 'id_'+m2.treeNodeId" :index="m2.url" v-for="m2 in m.children">
        <template slot="title">
          <i :class="m2.icon"></i>
          <span>{{m2.treeNodeName}}</span>
        </template>
      </el-menu-item>
    </el-submenu>
  </el-menu>
</template>
<script>
  export default {
    data() {
      return {
        collapsed: false,
        menus: []
      }
    },
    created() {
      this.$root.Bus.$on("collapsed-side", (v) => {
        this.collapsed = v;
      });
      let url = this.axios.urls.SYSTEM_MENU_TREE;
      this.axios.post(url,{}).then((response) => {
        console.log(response);
        this.menus=response.data.result;
      }).catch((response) => {
        console.log(response);
      });
    }
  }
</script>
<style>
  .el-menu-vertical-demo:not(.el-menu--collapse) {
    width: 240px;
    min-height: 400px;
  }

  .el-menu-vertical-demo:not(.el-menu--collapse) {
    border: none;
    text-align: left;
  }

  .el-menu-item-group__title {
    padding: 0px;
  }

  .el-menu-bg {
    background-color: #1f2d3d !important;
  }

  .el-menu {
    border: none;
  }

  .logobox {
    height: 40px;
    line-height: 40px;
    color: #9d9d9d;
    font-size: 20px;
    text-align: center;
    padding: 20px 0px;
  }

  .logoimg {
    height: 40px;
  }
</style>

Jump interface

Router.js (Routing)

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import login from '@/views/login'
import Reg from '@/views/Reg'
import AppMain from '@/components/AppMain'
import Articles from '@/views/sys/Articles'


Vue.use(Router)

export default new Router({
  routes: [{
      path: '/',
      name: 'login',
      component: login
    },
    {
      path: '/login',
      name: 'login',
      component: login
      },
      {
       path: '/Reg',
       name: 'Reg',
       component: Reg
       },
       {
        path: '/AppMain',
        name: 'AppMain',
        component: AppMain,
        children:[
          {
           path: '/sys/Articles',
           name: 'Articles',
           component: Articles
           }
        ]
        }
    ]
})

Articles.vue

<template>
  <div>
        //Article Management Interface
  </div>
</template>

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

      };
    }
  }
</script>

<style>
</style>

The effect is as follows:

Data Display and Paging Query

Articles.vue

<template>
  <div>
    <!-- Search and screen-->
    <el-form :inline="true" :model="formInline" class="user-search">
      <el-form-item>
          <el-input size="small" v-model="formInline.title" placeholder="Enter the title of the article"></el-input>
      </el-form-item>
      <el-form-item>
          <el-button size="small" type="primary" icon ="el-icon-search" @click="search">search</el-button>
      </el-form-item>
    </el-form>
       <!--list -->
       <el-table size="small" :data="listData" border element-loading-text="Desperate Loading" style="width: 100%;">
         <el-table-column sortable prop="id" label="ID" width="300">
         </el-table-column>
         <el-table-column sortable prop="title" label="Article title" width="300">
         </el-table-column>
         <el-table-column sortable prop="body" label="Article content" width="300">
         </el-table-column>


       </el-table>

       <el-pagination style="margin-top: 20px;" @size-change="handleSizeChange" @current-change="handleCurrentChange"
		:current-page="formInline.page" :page-sizes="[10, 20, 30, 50]" :page-size="formInline.rows" layout="total, sizes, prev, pager, next, jumper"
		:total="total">
		</el-pagination>
  </div>
</template>

<script>
  export default{
    data(){
      return {
          listData:[],
          total:0,
          formInline:{
            title:'',
            page:1,
            rows:10,
            total:0
          }
      };
    },
    methods:{
      search(){
        this.doSearch(this.formInline);
      },
      doSearch(params){
        let url = this.axios.urls.SYSTEM_ARTICLE_LIST;
        this.axios.post(url,params).then((response) => {
          console.log(response);
          this.listData=response.data.result;
          this.total=response.data.pageBean.total;
        }).catch((response) => {
          console.log(response);
        });
      },
      handleSizeChange(rows) {
				this.formInline.page = 1;
				this.formInline.rows = rows;
				this.search();
			},
			handleCurrentChange(page) {
				this.formInline.page = page;
				this.search();
			}
    },
    created(){
       this.doSearch({});
    }
  }
</script>

<style>
</style>

The effect is as follows:

It's a success, skr~.

Posted by tomdude48 on Sat, 05 Oct 2019 12:20:36 -0700