后台数据
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>