动态树+数据表格+分页

本文介绍了如何使用Vue技术栈,结合后台数据,实现动态展示的树形数据表格,并配合分页功能。涉及到的主要前端组件包括TopNav、Mave、LeftAside和BookList,以及对数据进行模糊查询的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态树+数据表格+分页

后台数据

t_user_vue
t_module_vue
t_book_vue
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建这三张数据库表

前端代码

在这里插入图片描述
TopNav.vue类

<template>
  <el-menu class="el-menu-demo" mode="horizontal" background-color="#334157" text-color="#fff" active-text-color="#fff">
    <el-button class="buttonimg">
      <img class="showimg" :src="collapsed?imgshow:imgsq" @click="doToggle()">
    </el-button>
    <el-submenu index="2" class="submenu">
      <template slot="title">超级管理员</template>
      <el-menu-item index="2-1">设置</el-menu-item>
      <el-menu-item index="2-2">个人中心</el-menu-item>
      <el-menu-item @click="exit()" index="2-3">退出</el-menu-item>
    </el-submenu>
  </el-menu>
</template>

<script>
  export default {
    name: 'TopNav',
    data: function() {
      return {
        collapsed: false,
        imgshow: require('../assets/img/show.png'),
        imgsq: require('../assets/img/sq.png')
      }
    },
    methods: {
      doToggle: function() {
        this.collapsed=!this.collapsed;
        //console.log(this.collapsed);
        this.$emit('topnav-collapsed',this.collapsed);
      },
      exit: function() {
        this.$confirm('确认要退出系统吗?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.$message({
            type: 'success',
            message: '注销成功!'
          });
          this.$router.push('/');
        }).catch();
      }
    }
  }
</script>

<style scoped>
  .el-menu-vertical-demo:not(.el-menu--collapse) {
    border: none;
  }

  .submenu {
    float: right;
  }

  .buttonimg {
    height: 60px;
    background-color: transparent;
    border: none;
  }

  .showimg {
    width: 26px;
    height: 26px;
    position: absolute;
    top: 17px;
    left: 17px;
  }

  .showimg:active {
    border: none;
  }
</style>

在这里插入图片描述
Mave.vue类

<template>
	<el-container class="main-container">
		<el-aside :class="isCollapsed">
			<LeftAside :left-collapsed="collapsed"></LeftAside>
		</el-aside>
		<el-container>
			<el-header class="main-header">
				<TopNav @topnav-collapsed="mainCollapse"></TopNav>
			</el-header>
			<el-main class="main-center">
        <router-view/>
      </el-main>
		</el-container>
	</el-container>
</template>

<script>




	// 导入组件
	import TopNav from '@/components/TopNav.vue'
	import LeftAside from '@/components/LeftAside.vue'

	// 导出模块
	export default {
    name:'Main',
    data:function(){
      return{
        collapsed: false
        //asideClass:'main-aside-collapsed'
      }
    },
    methods:{
      mainCollapse:function(c){
        this.collapsed=c;
        console.log("Main组件=%s",this.collapsed);
      }
    },
    components:{
      TopNav,
      LeftAside
    },
    computed:{
      isCollapsed:function(){
        return this.collapsed?'main-aside-collapsed':'main-aside'
      }
    }
	};
</script>
<style scoped>
	.main-container {
		height: 100%;
		width: 100%;
		box-sizing: border-box;
	}

	.main-aside-collapsed {
		/* 在CSS中,通过对某一样式声明! important ,可以更改默认的CSS样式优先级规则,使该条样式属性声明具有最高优先级 */
		width: 64px !important;
		height: 100%;
		background-color: #334157;
		margin: 0px;
	}

	.main-aside {
		width: 240px !important;
		height: 100%;
		background-color: #334157;
		margin: 0px;
	}

	.main-header,
	.main-center {
		padding: 0px;
		border-left: 2px solid #333;
	}
</style>

LeftAside.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="leftCollapsed">
		<!-- <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>
    <el-menu-item index="/Home">
    	<i class="el-icon-s-home"></i>
    	<span slot="title">首页</span>
    </el-menu-item>
    <el-submenu v-for="root in treeNodelst"
    :key="'key-'+root.id"
    :index="'index-'+root.id">
      <template slot="title">
      	<i :class="root.icon"></i>
      	<span>{{root.text}}</span>
      </template>
      <el-menu-item v-for="node in root.children"
      :key="'key-'+node.id"
      :index="node.url">
      	<i :class="node.icon"></i>
      	<span slot="title">{{node.text}}</span>
      </el-menu-item>
    </el-submenu>
	</el-menu>
</template>
<script>
	export default {
    name:'LeftAside',
    props:['leftCollapsed'],
    data:function(){
      return{
        treeNodelst:[]
      }
    },
    created:function(){
      let url=this.axios.urls.SYSTEM_MODULE_TREENODE;
      let params={
        methodName:'queryTreeNode'
      };
      this.axios.get(url,{params:params}).then(resp=>{
        this.treeNodelst= resp.data.data;
        console.log(this.treeNodelst);
      }).catch(resp=>{

      });
      //配置首页默认打开
      this.$router.push('/Home');
    }
	}
</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>

在这里插入图片描述

模糊查询及分页
BookList.vue类

<template>
  <div>
    <el-breadcrumb separator="/" style="padding-top:15px ;">
      <el-breadcrumb-item :to="{ path: '/Home' }">首页</el-breadcrumb-item>
      <el-breadcrumb-item>书本管理</el-breadcrumb-item>
    </el-breadcrumb>

    <!-- 搜索栏 -->
    <el-form :inline="true" class="demo-form-inline" style="margin-top: 15px;">
      <el-form-item label="书本名称">
        <el-input v-model="bookname"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="query(1)">查询</el-button>
      </el-form-item>
    </el-form>

    <!-- 表格 -->
    <el-table :data="result" style="width: 100%;" :border="true" max-height="550">
      <el-table-column prop="id" label="书本编号" min-width="30" align="center"></el-table-column>
      <el-table-column prop="bookname" label="书本名称" min-width="30"></el-table-column>
      <el-table-column prop="price" label="书本价格" min-width="70"></el-table-column>
      <el-table-column prop="booktype" label="书本类型" min-width="70"></el-table-column>
    </el-table>

    <!-- 分页 -->
    <el-pagination
      background
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="page"
      :page-sizes="[10, 20, 30, 40]"
      :page-size="rows"
      layout="total, sizes, prev, pager, next, jumper"
      :total="total">
    </el-pagination>
  </div>
</template>

<script>
  export default {
    name: 'BookList',
    data: function() {
      return {
        bookname: null,
        result:[],
        total:0,
        page:1,
        rows:10
      }
    },
    methods: {
      query: function(page) {
        if(null!=page){
          this.page=page;
        }
        let url=this.axios.urls.BOOK_BOOKLIST;
        let params={
          bookname:this.bookname,
          methodName:'queryBookPager',
          page:this.page,
          rows:this.rows
        };
        this.axios.post(url,params).then(resp=>{
            console.log(resp.data.data.rows);
            this.result=resp.data.data.rows;
            this.total=resp.data.data.total;
        }).catch(resp=>{

        });
      },
      handleSizeChange:function(rows){
        this.rows=rows
        this.query(null);
      },
      handleCurrentChange:function(page){
        this.page=page;
        this.query(null);
      }
    }
  }
</script>

<style>
</style>

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值